这是一个基本问题,但出于某种原因,我对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
但它基本上就是我想要的。另外,我想在不涉及JOB中的tableb的情况下这样做,因为在我使用它时会有各种其他表格加入,我不想混淆图片。这必须如此简单!
答案 0 :(得分:4)
一种hackish方法:
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子句限制为巧克力或cookie),然后仅返回具有2个首选项的用户。
答案 1 :(得分:2)
最简单且最快方式是加入tablec
两次,一次用于巧克力,另一种用于Cookie
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