写这个问题非常困难,但下面是一个表格来说明我的问题。
Id itemID categoryID
1 5 10
2 5 16
3 6 10
4 2 10
如果我有这样的表设置,并且我想选择其中categoryID等于10 AND 16的“itemID”,则结果应该是itemID 5.更多的上下文将是用户具有的复选框列表categoryID's,如果他们只选择categoryID 10,则会出现itemID 5,2和6。如果他们也选择了categoryID 16,那么只会出现itemID 5,因为它有类别10和16,其中itemID 2只有类别10。
答案 0 :(得分:3)
这是“set-within-sets”子查询的示例。我认为解决这些问题的最常用方法是使用聚合和having
子句:
select itemID
from t
group by itemId
having sum(case when categoryID = 10 then 1 else 0 end) > 0 and
sum(case when categoryID = 16 then 1 else 0 end) > 0;
having
子句中的每个条件都计算与一个类别匹配的行数。您可以轻松查看这将如何推广更多类别或排除类别。例如,如果你想要10和16而不是22:
select itemID
from t
group by itemId
having sum(case when categoryID = 10 then 1 else 0 end) > 0 and
sum(case when categoryID = 16 then 1 else 0 end) > 0 and
sum(case when categoryID = 22 then 1 else 0 end) = 0;
答案 1 :(得分:1)
加入桌子:
select t1.itemID
from mytable t1
join mytable t2 on t2.itemID = t1.itemID
where t1.categoryID = 10
and t2.categoryID = 16;