我有数据表1:
+----+---------+-------+
| ID | GenreID | Title |
+----+---------+-------+
| 1 | 1 | Fox |
| 2 | 12 | Fox |
| 3 | 1 | Cat |
| 4 | 4 | Cat |
| 5 | 1 | Lion |
| 6 | 12 | Lion |
| 6 | 3 | Tiger |
| 5 | 12 | Tiger |
+----+---------+-------
如何获得同时具有GenreID = 1和12的标题?
我想要的结果是返回标题:
Fox
和Lion
。但是,如果我使用IN
,则结果为:fox
,lion
,cat
,tiger
最佳答案
由于要返回同时具有GenreId = 1
和GenreID = 12
的行,因此必须使用一些关系除法。该查询将使用IN
子句返回具有所需的GenreIDs
的行,但是您还将使用GROUP BY
和HAVING
来过滤出具有以下内容的行:
select title
from yourtable
where genreid in (1, 12)
group by title
having count(distinct genreid) = 2;
请参见SQL Fiddle with Demo。这将返回
Fox
和Lion
。 HAVING
子句计算返回的GenreIDs
的不同数量。在这种情况下,您希望该值等于WHERE子句中包含的ID总数2。您可以通过多种方法获得结果,包括跳过
WHERE
子句,并在HAVING中使用聚合函数和一些条件逻辑:select title
from yourtable
group by title
having sum(case when GenreID = 1 then 1 else 0 end) = 1
and sum(case when GenreID = 12 then 1 else 0 end) = 1;
见SQL Fiddle with Demo