タグ付けシステムの作成を希望するクライアントがいます。、、、の3 つのテーブルがあります。最後のテーブルは、items
item_idと tag_id を関連付けるだけです。私が抱えている問題は次のとおりです。tags
item_tag_assoc
ユーザーがタグ [1, 2, 3] を含め、タグ [4, 5, 6] を除外するように要求した場合、結果は[1, 2, 3] にすべてのタグ (1 つだけでなく) があり、タグがないすべてのアイテムになります。 [4、5、6]。これを達成するためのクエリを作成するにはどうすればよいですか?
タグを含めるための内部結合を把握するのに十分な調査を行いました。
SELECT i.item_id, i.item_title FROM items AS i INNER JOIN tag_item_assoc AS tia1 ON (tia1.item_id = i.item_id AND tia1.tag_id = 1)
...そして、含めたいタグの数だけ、同じ内部結合パターンでチェーンするだけです。少しかさばるかもしれませんが、ユーザーは先に進む前に 4 つまたは 5 つ以上のタグを選択することはないので、それで十分です。
同じ方法で除外し、すべてを 1 つのクエリにラップできることを本当に望んでいました。
INNER JOIN tag_item_assoc AS tia2 ON (tia2.item_id = i.item_id AND tia2.tag_id!= 2)
しかし、うまくいかないことがすぐに明らかになりました。s を使用すると、含めている間は除外できるという記事をいくつか読みましたが、ほとんどの場合、節LEFT OUTER JOIN
がばらばらであるために、それらを理解できませんでした。私が試したs とs のWHERE
順列は、エラーが発生するか、非常に紛らわしい結果になりました。LEFT OUTER JOIN
INNER JOIN
つまり、これを達成する方法を知っている人はいますか? 提供できる有用なコード例がないことをお詫びします。s が障害になる場合は、ゼロから始めても問題INNER JOIN
ありません。複数の関連付けの包含と除外を同時に達成する方法が必要なだけです。助けと専門知識を前もってありがとう!