0

可能重复:
如何过滤 SQL 结果中的多通关系

我正在为我的 android 应用程序编写一条 SQL 语句,该应用程序具有特殊的 JOIN 要求。有 2 张桌子,一张用于 PERSON,一张用于 INTEREST。一个人可能有多个利益。

我正在寻找一个只返回具有所有指定兴趣的人的查询。这是我的示例表:

PERSON
_id | name
1   | Bob
2   | Harry
3   | Lucy
4   | Sally

INTERESTS
_id | person | interest
1   | bob    | skiing
2   | bob    | biking
3   | bob    | swimming
4   | harry  | skiing
5   | harry  | surfing
6   | harry  | swimming

我希望查询找到所有喜欢滑雪和骑自行车的人(即只有鲍勃)。如果可能的话,我也会撒谎只为鲍勃返回一次记录。SQLite 可以做这样的查询吗?如果是这样,怎么做?

提前谢谢了!

4

3 回答 3

0

我通常会多次加入表格,但如果您不知道搜索条件,这可能会很棘手。这意味着,如果您按 2 个不同的兴趣进行搜索,您将加入兴趣表两次。

这样的事情将适用于您上面的问题:

select distinct p.name
from person p
    join interests i on p.name = i.person and i.interest = 'skiing'
    join interests i2 on p.name = i2.person and i2.interest = 'biking'

这应该让您返回 Bob。

作为旁注,您应该将 personid 存储在您的兴趣表中,而不是名称中。并考虑引入带有 PersonId 和 InterestId 的 PersonInterests 表——这对于规范化会更好。

祝你好运。

于 2013-01-26T01:14:04.687 回答
0

也许这个:

SELECT p.name FROM person p JOINinterests i on p.name = i.person GROUP BY p.name HAVING count(*) = 2 WHERE i.interest in ('skiing', 'biking')。

我同意最好在兴趣表中使用人员 ID 而不是名称。另一个建议:你应该有一个单独的表和兴趣 id,并且表人兴趣中只有两个 id。

于 2013-01-26T06:33:11.263 回答
0

除了其他解决方案之外,使用Exists()运算符是执行此类请求的一种简单方法,例如:

SELECT p.* FROM person p Where Exists (Select * from interests i where i.person = p.name and i.interest = 'skiing') and Exists (Select * from interests i where i.person = p.name and i.interest = 'biking')

此外,您应该将表的 存储_id为表person中的外键,interests而不是name. 这样,您可以拥有多个同名的人,或者稍后更改一个人的姓名,而无需更改其他相关表中的值。

interests使用复数形式作为表名,而使用单数形式作为表名也不是一个好主意person

于 2013-01-26T08:44:53.703 回答