Filtering from join-table

后端 未结 2 1767
鱼传尺愫
鱼传尺愫 2021-01-21 10:46

I\'m having some trouble with a tricky SQL-query.

In my MySQL database there is the tables topics, tags and tags_topics to join them. I want to fetch topics that share

相关标签:
2条回答
  • 2021-01-21 10:52

    JOIN solution:

    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 solution:

    Note that you need to list all t.* columns in the GROUP BY clause, unless you use MySQL or SQLite.

    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;
    

    Subquery solution:

    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);
    

    Modified GROUP BY solution:

    Simplifies GROUP BY clause by isolating search in a subquery.

    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
    );
    
    0 讨论(0)
  • 2021-01-21 11:15
    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 */
    
    0 讨论(0)
提交回复
热议问题