我有一个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