我有数据表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的Title?
我想要的结果是返回标题:Fox
和Lion
。但如果我使用IN
,结果为:fox
,lion
,cat
,tiger
答案 0 :(得分:5)
由于您要返回同时包含GenreId = 1
AND 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
的不同数量。在这种情况下,您希望它等于2,即WHERE子句中包含的ID总数。
有许多不同的方法可以获得结果,包括跳过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;
答案 1 :(得分:3)
SELECT title from [tab] where GenreId = 1
INTERSECT
SELECT title from [tab] where GenreId = 12