簡體   English   中英

我該如何寫這個查詢?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM