首页 文章

mysql多对多内连接和条件

提问于
浏览
1

我有3个表,帖子,标签和post_tags . 帖子和标签有很多关系 .

posts table
+----+------------------------------------------------------+
| id | title                                                |
+----+------------------------------------------------------+
|  1 | title1                                               |
|  2 | title2                                               |
|  3 | title3                                               |
+----+------------------------------------------------------+

post_tags table
+----+---------+--------+
| id | post_id | tag_id |
+----+---------+--------+
| 1 |       1 |      2  |
| 2 |       1 |      3  |
| 3 |       1 |      4  |
| 4 |       2 |      2  |
| 5 |       2 |      4  |
| 6 |       2 |      5  |
| 7 |       2 |      6  |
| 8 |       3 |      3  |
| 9 |       3 |      4  |
| 10 |      3 |      5  |
+----+---------+--------+

所以,我需要根据tag_id查找帖子,如果我只有一个标签,解决方案似乎很容易 .

SELECT posts.id, posts.title 
FROM posts
INNER JOIN post_tags
ON posts.id = post_tags.post_id 
    AND post_tags.tag_id = 2

所以,我只得到post_tags表中有tag_id 2的帖子 . 所以,现在我想只获取那些同时拥有tag_id 2和3的帖子 . 我的意思是,如果某些帖子有tag_id 2而不是3,则不应提取这些帖子 . 我怎样才能做到这一点?

我试过这个

SELECT posts.id, posts.title 
FROM posts
INNER JOIN post_tags
ON posts.id = post_tags.post_id
    AND post_tags.tag_id = 2 
    AND post_tags.tag_id = 3

但它返回空,我想我可以理解为什么,因为它似乎为同一个tag_id字段制作了两个条件 .

UPDATE:

此查询返回所有具有tag_id 2 OR 3的帖子,但需要2 AND 3

SELECT posts.id, posts.title 
    FROM posts 
    INNER JOIN post_tags 
    ON posts.id = post_tags.post_id AND post_tags.tag_id IN (2,3);

谢谢

3 回答

  • 1

    也许这样的事情可能有助于做到这一点

    select posts.id, posts.title 
    from posts
    INNER JOIN post_tags
    ON posts.id = post_tags.post_id 
    group by posts.id
    having max(post_tags.tag_id=2) > 0 
    and    max(post_tags.tag_id=3) > 0
    

    你可以检查解决方案here

  • 1

    使用IN子句

    SELECT posts.id, posts.title FROM posts INNER JOIN post_tags ON posts.id = post_tags.post_id AND post_tags.tag_id IN (2,3);
    

    这可能适合你

  • 0

    你可以这样做

    SELECT p.id, p.title 
      FROM post p JOIN post_tags t
        ON p.id = t.post_id
     WHERE t.tag_id IN (2, 3)
     GROUP BY p.id, p.title
    HAVING COUNT(DISTINCT t.tag_id) = 2
    

    输出:

    | ID |  TITLE |
    ---------------
    |  1 | title1 |
    

    这是 SQLFiddle 演示

相关问题