这是一个如此基本的问题,但由于某种原因,我所有的SQL知识都刚刚退出大楼。三个基本表:
Table A
id | name
---------
1 | John
2 | Mike
3 | Henry
4 | Cooper
Table B
id | tag
---------
1 | chocolate
2 | ice cream
3 | cookies
和连接两者的表:
Table C
id | name_id | tag_id
---------------------
1 | 1 | 2
2 | 1 | 3
3 | 2 | 1
4 | 3 | 2
5 | 3 | 3
我想找到既喜欢巧克力又喜欢饼干的人。下面给出了所有喜欢巧克力和饼干的人,但我只想要既喜欢巧克力又喜欢饼干的人(巧克力和饼干而不是巧克力或饼干)。
SELECT name FROM tablea a JOIN tablec c ON a.id = c.name_id WHERE c.tag_id IN (1,3)
下面显然是行不通的:
SELECT name FROM tablea a JOIN tablec c ON a.id = c.name_id WHERE c.tag_id = 1 AND c.tag_id = 3 GROUP BY name
但这就是我想要的。此外,我希望在不涉及JOIN中的表的情况下这样做,因为在我使用它的地方,将有各种其他表连接在一起,我不想混淆图片。这一定很简单!
一个简单的方法:
SELECT name, COUNT(c.tag_id) AS cnt
FROM tablea a
JOIN tablec c ON a.id = c.name_id
WHERE c.tag_id IN (1,3)
GROUP BY name
HAVING cnt = 2
计算每个用户有多少个偏好(通过where子句限制为巧克力或饼干),然后只返回那些有2个偏好的用户。
最简单且最快的方法是两次加入tablec
,一次是巧克力,另一次是饼干
select name
from tablea a
inner join tablec chocolates on a.id = chocolates.name_id
inner join tablec cookies on a.id = cookies.name_id
where chocolates.tag_id = 1
and cookies.tag_id = 3