我有数据表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的标题?

我想要的结果是返回标题:FoxLion。但是,如果我使用IN,则结果为:foxlioncattiger

最佳答案

由于要返回同时具有GenreId = 1GenreID = 12的行,因此必须使用一些关系除法。该查询将使用IN子句返回具有所需的GenreIDs的行,但是您还将使用GROUP BYHAVING来过滤出具有以下内容的行:

select title
from yourtable
where genreid in (1, 12)
group by title
having count(distinct genreid) = 2;


请参见SQL Fiddle with Demo。这将返回FoxLionHAVING子句计算返回的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

10-08 03:11