[英]How do I write this query?
我有以下mysql表:
map_id - module_id - category_id
1 - 3 - 6
2 - 3 - 9
3 - 3 - 11
4 - 4 - 6
5 - 4 - 9
6 - 4 - 12
map_id
是主鍵。 我有一個數組中的category_id
列表。
我的選擇標准是:
category_id
數組包含6,9 module_id = 3, 4
則應返回module_id = 3, 4
。 category_id
數組包含6,9,11,則只應返回module_id = 3
現在,如果我運行一個簡單的WHERE...IN
查詢,那么所有行都被選中,這不是我想要的。
編輯:其實我一直在尋找一個更動態的解決方案。 可能我的問題不明確(這是我的第一個)。
說我有這些category_id的:
$cat = array(6,9)
如果我查詢
"SELECT module_id FROM maptable WHERE category_id IN (".implode(',', $cat).")"
然后我得到了包含module_id 3和4的行。
另一方面,如果數組是
$cat = array(6,9,11)
我運行相同的查詢,我再次得到相同的結果。 但是我這次只想要module_id = 3的行。
SQL並不是真的設計用於這樣的查詢,但它可以完成。
SELECT module_id FROM
(SELECT module_id FROM table WHERE category_id = 6) cat_6
JOIN (SELECT module_id FROM table WHERE category_id = 9) cat_9 USING (module_id)
JOIN (SELECT module_id FROM table WHERE category_id = 11) cat_11 USING (module_id)
確保在category_id, module_id
有索引,在module_id, category_id
上有第二個索引。 理想情況下,您可以制作這些唯
WHERE ((category_id = 6 OR category_id=9) AND module_id=3) OR ((category_id = 6 OR category_id=9 OR category_id = 11) AND (module_id=3 OR module_id=4))
?
這可能是一種更簡單的寫作方式,但我認為你明白了這一點:-)
當你使用WHERE ... IN時它意味着'任何in(...)value'
你可以使用AND代替
你可以嘗試:
SELECT * FROM `table`
WHERE (`module_id` IN(3,4) AND `category_id` IN(6,9))
OR (`module_id` IN(3) AND `category_id` IN(6,9,11))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.