mysql多对多内部连接和条件

标签 mysql many-to-many inner-join

我有 3 个表,posts,tags 和 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 字段创建了两个和条件。

更新:

此查询返回所有具有 tag_id 2 或 3,但需要 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 IN (2,3);

谢谢

最佳答案

你可以这样做

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 演示

关于mysql多对多内部连接和条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18009898/

相关文章:

mysql - 快速获取mysql记录数的方法

mysql - 如何将 mysql 数据库与 Node 连接?

mysql - 如何在 MySQL 中的输出文件分隔符中使用特殊字符

mysql - 仅当 `in` 子句中的值存在时才返回值

java - 多对多连接表的 JPQL 查询

php - MySQL 连接返回太多行

mysql - SQL INNER JOIN 与 LIKE 和 WHERE

php - 从我的 sql 表行中搜索至少一个逗号分隔值

java - JPA 从具有多对多关联的集合中选择

Django基于M2M关系上的多个字段注释多个对象