これは十分に一般的であり、1 つの SQL クエリ (MySQL) でこれを実行する「最良の」方法を探しています。
items
テーブル、テーブル、テーブルの 3 つのテーブルが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"
)