質問
タグではなく、両方のタグを持つすべてのアイテムを取得するSQLクエリが必要です。私はすでにクエリを持っていますが、両方のタグを動かしたすべてのアイテムを返しますが、予期した結果ではありません。以下の詳細な説明をご覧ください。ありがとう!
テーブル構造:
ITEMS TABLE
------------
item_id
item_name
TAGS TABLE
----------
tag_id
tag_name
ITEMTAGS TABLE
---------------
tag_id
item_id
クエリ:
SELECT Items.* FROM Items
INNER JOIN ItemTags ON Items.item_id = ItemTags.item_id
WHERE ItemTags.tag_id IN (T1, T2)
GROUP BY Items.item_id
結果: T1またはT2を持つすべてのアイテム
期待される結果: T1とT2の両方を持つすべてのアイテム
解決
select i.*
from items i, itemtags it1, itemtags it2
where i.item_id=it1.item_id and it1.tag_id=T1
and i.item_id=it2.item_id and it2.tag_id=T2;
他のヒント
データベースが交差キーワードをサポートしている場合(SqlServerはサポートしています)、次のように記述できます。
SELECT Items.*
FROM Items
WHERE Items.item_id in
/* intersection between items that have the tag T1
and the ones that have the tag T2 */
(
SELECT item_id FROM ItemTags WHERE tag_id = T1
INTERSECT
SELECT item_id FROM ItemTags WHERE tag_id = T2
)
そうでない場合は、次のようにする必要があります:
SELECT Items.*
FROM Items
WHERE Items.item_id in
(
SELECT ItemTags1.item_id
FROM ItemTags as ItemTags1
INNER JOIN ItemTags as ItemTags2
ON ItemTags1.item_id = ItemTags2.item_id
WHERE
ItemTags1.tag_id = T1
AND ItemTags2.tag_id = T2
)
2回目のクエリでは、ItemTags1.item_id = ItemTags2.item_idが原因で起こりうるパフォーマンスの問題に対処します。うまく機能するには、外部キーのインデックスが必要です。
所属していません StackOverflow