我的表设置与下面类似。
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相交的行。
有没有办法做到这一点?
答案 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中描述了此解决方案的更多详细信息。