我有一個MySQL數據庫,它看起來像:SQL過濾器和規則跨越多個行
item table
| id | name |
item_category link table
| item_id | category_id |
category table
| id | name |
如果我要取的是涉及到許多類別的一個項目,我可以簡單地做:
SELECT item.*
FROM item
JOIN item_category ON item_category.item_id = item.id
LEFT JOIN category ON category.id = item_category.category_id
WHERE category.name in ("category_one", "category_two")
但是,如果我想要獲得與所有類別列表相關的項目,則問題會變得稍微複雜一些,因爲從我的查詢返回的行每個都包含一個類別。如何編寫一個查詢,其中只包含與所有類別相關的項目?
我試着寫一個查詢與嵌套的選擇是這樣的:
SELECT item.*
FROM item
WHERE EXISTS (
SELECT item.id
FROM item_category ON item_category.item_id = item.id
LEFT JOIN category ON category.id = item_category.category_id
WHERE item_category.id = item.id
AND category.name = "category_one"
)
AND EXISTS (
SELECT item.id
FROM item_category ON item_category.item_id = item.id
LEFT JOIN category ON category.id = item_category.category_id
WHERE item_category.id = item.id
AND category.name = "category_two"
)
但是,這是即使在相關領域的指標令人難以置信unperformant。
謝謝你對這個問題的任何意見。
請參閱:[爲什麼我應該爲我認爲是非常簡單的SQL查詢提供一個MCVE?](https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an -mcve換什麼,似乎對我將要-A-極簡單的SQL查詢)。此外,關於查詢性能的問題總是需要SHOW CREATE TABLE語句來顯示所有相關的表格以及EXPLAIN的結果。 – Strawberry
順便說一句,'LEFT JOIN x ... WHERE x = ...'和'INNER JOIN x ...'一樣 – Strawberry