0

タグテーブルがあります-id、name、owner_id(owner_idはユーザーのFKです)

および user_tags テーブル - user_id、tag_id (これらのタグを共有するためのタグとユーザー間のリンクテーブル - つまり、タグにアクセスできるが所有者ではないユーザー)

user_tags テーブルの結合を介してタグを取得できるクエリがあります。

SELECT tags . * 
FROM tags
JOIN user_tags ON user_tags.user_id =2
AND user_tags.tag_id = tags.id
LIMIT 0 , 30

しかし、同じクエリで、タグ WHERE tags.owner_id = 2 を選択して、リンク テーブル (user_tags) を介してそのユーザーと共有されているすべてのタグと、ユーザーが所有するタグ (tags.owner_id = user_id) を取得したいと思います。

結合後に WHERE tags.owner_id = 2 を含めると、tags.owner_id = 2 の結果のみが返されます。

OR tags.owner_id = 2 を含めると、すべての結果が繰り返されます。

ステートメントSELECT DISTINCT... OR tags.owner_id = 2を作成すると、正しい結果セットになりますが、それが条件付きの結合を行う正しい方法かどうかはわかりません。

より良い方法/ベストプラクティスはありますか?

また、結合が複数の結果を返すのはなぜですか (つまり、なぜ、SELECT DISTINCTまたはGROUP BY必要なのですか?

ありがとうございました。

構造を明確にするための編集

4

1 に答える 1

1

結合条件の一部として user_tags.user_id を使用しません。意図を明確にするために、where 句で両方の条件を指定してください。しかし、あなたの質問に答えるには、はい、1 つの tags.id を多くの user_tags.tag_id に関連付けることができる場合、DISTINCT でタグを重複排除する必要があります。

SELECT DISTINCT tags.*
FROM tags
JOIN user_tags ON tags.id = user_tags.tag_id
WHERE user_tags.user_id = 2
OR user_tags.owner_id = 2
LIMIT 0,30
于 2013-06-06T00:44:27.490 に答える