我有一个网站上的项目列表。每个项目都附有几个类别,让我们称这些类别为电影类型。在高级搜索中,我让人们选中他们喜欢的类型的复选框,它会显示与所选类型相匹配的电影列表。
我有这样的查询:
AND column IN ('5', '8', '9')
这里的问题是,如果你选择“动画”和“恐怖”,你会得到一堆迪士尼卡通片(“动画片”)和SAW系列片(“恐怖片”)。
我希望将搜索调整为全包,因此它只返回与所有选定类型匹配的结果,因此将返回标记为“动画”和“恐怖”的项目。
item_id和category_id对存储在单独的表中。因此,对于ID为55的电影,可能有4种类型,因此将有4行,其中item_id = 55,而category_id等于4类别ID。
答案 0 :(得分:22)
编辑:修改了我的答案,以更贴近OP的编辑问题。
select i.MovieName
from item i
inner join ItemCategory ic
on i.item_id = ic.item_id
where i.item_id = 55
and ic.category_id in ('5','8','9')
group by i.MovieName
having count(distinct ic.category_id) = 3
答案 1 :(得分:8)
您需要的运算符名为relational division。
SQL没有直接实现,你必须自己动手。以下文章讨论了一些常见的方法:
Divided We Stand: The SQL of Relational Division by Joe Celko
答案 2 :(得分:2)
如果您正在使用adhoc查询,则可以构建类似
的内容select *
from item_id t0
left join category_id t1 on t1.itemId=t0.Id and t1.gemres = 5
left join category_id t2 on t2.itemId=t0.Id and t2.gemres = 8
left join category_id t3 on t3.itemId=t0.Id and t3.gemres = 9
where (t1.Id is not null and t2.Id is not null and t3.Id is not null)