MySQl返回与第二个表值匹配AND / OR的记录

时间:2011-11-07 21:20:22

标签: mysql sql

这是一个基本问题,但出于某种原因,我对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的情况下这样做,因为在我使用它时会有各种其他表格加入,我不想混淆图片。这必须如此简单!

2 个答案:

答案 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