MYSQL:查找多个ID匹配的行

时间:2013-12-03 01:24:52

标签: php mysql relational-division

我的表设置与下面类似。

genre_id  series_id
1         4
1         2
2         5
4         1
2         4
3         3

我想要做的是能够根据所选类型的混合找到所有系列。

例如,找到所有类型为1和2的系列。假设我想要的结果是系列ID为4.

如果我使用

SELECT series_id FROM table WHERE genre_id = 1 AND genre_id = 2

它什么都不返回。

如果我使用

SELECT series_id FROM table WHERE genre_id in (1, 2)

它返回1和2中的所有内容。但我只想要genre_id相交的行。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

SELECT series_id FROM table
WHERE genre_id IN (1, 2)
GROUP BY series_id
HAVING COUNT(*) = 2

注意这是假设对(genre_id,series_id)是唯一的。如果不是,则必须将HAVING子句更改为

HAVING COUNT(DISTINCT genre_id) = 2

另请注意,2子句中的数字HAVING必须与IN子句中的项目数相匹配。

答案 1 :(得分:0)

您可以将IN()谓词视为基本上是一系列OR项;它相当于

SELECT series_id
FROM MyTable 
WHERE genre_id = 1 OR genre_id = 2

你想要的是将OR转换为AND,但这没有任何意义,因为WHERE表达式一次适用于一行。那里有genre_id在同一行上不能同时为1

因此,您需要比较一个表达式中两个不同行的genre_id。您可以通过连接两行来完成此操作:

SELECT t1.series_id
FROM MyTable AS t1
INNER JOIN MyTable AS t2 USING (series_id)
WHERE t1.genre_id = 1 AND t2.genre_id = 2

还有一个使用GROUP BY的解决方案,如另一个answer所示,但如果定义正确的索引,自连接的效率可以提高几个数量级。

我在演示文稿SQL Query Patterns, Optimized中描述了此解决方案的更多详细信息。