这应该很常见,我正在寻找在一个 SQL 查询(MySQL)中执行此操作的“最佳”方式。
我有三张桌子,一张items
桌子,一张linker
桌子,一张tags
桌子。项目可以被标记多次,因此链接器是一个简单的外键链接器表:
items | linker | tags
--------+---------+-------
item_id | item_id | tag_id
... | tag_id | name
--------+---------+-------
我可以items
轻松搜索单个标签,我将如何搜索具有 2 个或更多特定标签的项目?
SELECT *, `tags`.`name`
FROM `items`
LEFT OUTER JOIN `linker` USING (`item_id`)
LEFT OUTER JOIN `tags` USING (`tag_id`)
WHERE `tags`.`name` = "tag-a"
一个理智的人如何搜索 2 个或更多标签,一个项目必须具有所有标签,即AND
查询?
编辑:到目前为止,我所拥有的是以下内容,它有效并且似乎并不慢,但看起来很疯狂:
SELECT `items`.* FROM `items`
LEFT OUTER JOIN `linker` USING (`item_id`)
LEFT OUTER JOIN `tags` USING (`tag_id`)
WHERE (
`item_id` IN (SELECT item_id FROM linker LEFT JOIN tags USING (tag_id) WHERE name = "tag-a")
AND `item_id` IN (SELECT item_id FROM linker LEFT JOIN tags USING (tag_id) WHERE name = "tag-b")
AND `item_id` IN (SELECT item_id FROM linker LEFT JOIN tags USING (tag_id) WHERE name = "tag-c")
AND `item_stuff` = "whatever"
)