質問

タグではなく、両方のタグを持つすべてのアイテムを取得する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が原因で起こりうるパフォーマンスの問題に対処します。うまく機能するには、外部キーのインデックスが必要です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top