使用MySQL IN子句作为全包(AND而不是OR)

时间:2011-01-20 19:05:36

标签: sql mysql

我有一个网站上的项目列表。每个项目都附有几个类别,让我们称这些类别为电影类型。在高级搜索中,我让人们选中他们喜欢的类型的复选框,它会显示与所选类型相匹配的电影列表。

我有这样的查询:

AND column IN ('5', '8', '9')

这里的问题是,如果你选择“动画”和“恐怖”,你会得到一堆迪士尼卡通片(“动画片”)和SAW系列片(“恐怖片”)。

我希望将搜索调整为全包,因此它只返回与所有选定类型匹配的结果,因此将返回标记为“动画”和“恐怖”的项目。

item_id和category_id对存储在单独的表中。因此,对于ID为55的电影,可能有4种类型,因此将有4行,其中item_id = 55,而category_id等于4类别ID。

3 个答案:

答案 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)