【问题标题】:mysql many to many inner join with and conditionmysql多对多内连接和条件
【发布时间】:2013-08-02 06:11:55
【问题描述】:

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

谢谢

【问题讨论】:

  • 你能显示你的数据库吗
  • @bew 我编辑了问题

标签: mysql many-to-many inner-join


【解决方案1】:

你可以这样做

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 

输出:

|身份证 |标题 | --------------- | 1 |标题1 |

这里是SQLFiddle演示

【讨论】:

  • 它有效!!,感谢您的回复,我只想问一件事,这是最优化的方式(如果有其他方式),因为我正在处理大型数据库。谢谢
  • @Davo 应该够快了。确保您拥有所有必要的索引。与性能优化一样,对查询执行EXPLAIN 并对其进行基准测试。
【解决方案2】:

也许这样的事情可以帮助解决这个问题

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

【讨论】:

  • 感谢这为我完成了这项工作 ;-)
【解决方案3】:

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

愿这对你有用

【讨论】:

  • 感谢您的回复,但这会返回所有 tag_id 为 2 或 3 的帖子
  • 尝试在上述查询中添加“group by post_tags.post_id”
猜你喜欢
  • 2012-10-20
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多