質問

トリッキーなSQLクエリに問題があります。

MySQLデータベースには、それらを結合するためのテーブルトピック、タグ、およびタグトピックがあります。 指定された同じタグを共有するトピックを取得したい。たとえば、ID 1、2、3の3つのタグがあり、タグ1、2、3が関連付けられているすべてのトピックを取得するとします。トピックには他のタグを含めることができますが、指定されたすべてのタグを含める必要があります。

plz xDについて考えさせてください

編集:この質問でGROUP BYを使用したソリューションが見つかりました:結合テーブルのすべてのエントリに一致する行のみをフェッチする(SQL) よりエレガントなソリューションがある場合は、投稿してください:)

役に立ちましたか?

解決

JOIN ソリューション:

SELECT t.*
FROM topics t
 JOIN tags_topics t1 ON (t.id = t1.topicId AND t1.tagId = 1)
 JOIN tags_topics t2 ON (t.id = t2.topicId AND t2.tagId = 2)
 JOIN tags_topics t3 ON (t.id = t3.topicId AND t3.tagId = 3)

GROUP BY ソリューション:

MySQLまたはSQLiteを使用しない限り、 GROUP BY 句にすべての t。* 列をリストする必要があることに注意してください。

SELECT t.*
FROM topics t JOIN tags_topics tt 
  ON (t.id = tt.topicId AND tt.tagId IN (1,2,3))
GROUP BY t.id, ...
HAVING COUNT(*) = 3;

サブクエリソリューション:

SELECT t.*
FROM topics t
WHERE t.id = ANY (SELECT topicId FROM tags_topics tt WHERE tt.tagId = 1)
  AND t.id = ANY (SELECT topicId FROM tags_topics tt WHERE tt.tagId = 2)
  AND t.id = ANY (SELECT topicId FROM tags_topics tt WHERE tt.tagId = 3);

修正された GROUP BY ソリューション:

サブクエリで検索を分離することにより、 GROUP BY 句を簡素化します。

SELECT t.*
FROM topics t
WHERE t.id IN (
  SELECT tt.topicId FROM tags_topics tt 
  WHERE tt.tagId IN (1,2,3))
  GROUP BY tt.id HAVING COUNT(*) = 3
);

他のヒント

SELECT 
    topic_id
FROM
    tags_topics
WHERE
    tag_id IN (1,2,3)
GROUP BY
    topic_id
HAVING
    COUNT(*) > 2  /* or use COUNT(*) = 3 if you know that there cannot be duplicates in the junction table */
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top