2013-08-27 80 views
1

對這個問題的表述很困難,但下面是一個表格來說明我的問題。SQL - 選擇其值等於多個值的項目

Id itemID categoryID 
1  5   10 
2  5   16 
3  6   10 
4  2   10 

如果我有一個表設置這樣的,我要選擇「項目Id」,其中的categoryID等於10和16,其結果應該是ITEMID 5.多一點的上下文將是用戶的列表複選框是categoryID的,如果他們只選擇categoryID 10,則會出現itemID 5,2和6。如果他們也選擇categoryID 16,那麼只會出現itemID 5,因爲它具有類別10和16,其中itemID 2只具有類別10.

+0

'SELECT * FROM表WHERE的categoryID IN(10,16)'或'SELECT * FROM表WHERE categoryID IN(10)'有相應的動態插入'IN'的內容 –

+1

@GeorgesBrisset對不起,但沒有。第一個查詢將返回categoryId爲10或16(所有這些)的行。第二個會返回categoryId爲10的行(除Id = 2外) – supertopi

+0

@supertopi,感謝您的更正。我承認我沒有嘗試並且回答太快。 thx –

回答

3

這是「set-set-set」子查詢的示例。我想,這就是使用聚合和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; 
+2

擊敗我,但這是它的一個小提琴:http://sqlfiddle.com/#!5/83e4e/9/0 –

1

將表與自身:

select t1.itemID 
from mytable t1 
join mytable t2 on t2.itemID = t1.itemID 
where t1.categoryID = 10 
and t2.categoryID = 16;