MySQL 多个左连接

Posted

技术标签:

【中文标题】MySQL 多个左连接【英文标题】:MySQL Multiple Left Joins 【发布时间】:2010-12-31 17:06:43 【问题描述】:

我正在尝试为我正在开发的网站创建新闻页面。我决定我想使用正确的 mysql 查询(意思是 COUNT(id) 和连接而不是多个查询或 num_rows。)我使用的是 PDO 包装器,它应该可以正常工作,但直接通过MySQL CLI 应用程序。

基本上,我有 3 张桌子。一个是新闻,一个是cmets,一个是用户。我的目标是创建一个页面,显示所有(稍后将分页)新闻帖子的标题、正文、作者和日期。当我使用第二个查询来获取用户名时,这很好用,但后来我决定我宁愿使用 JOIN。

那么问题是什么?好吧,我需要两个连接。一种是获取作者的用户名,另一种是获取cmets的数量。当我简单地使用作者的用户名时,一切都按预期工作。显示新闻表中的所有行(有 2 行)。但是,当我为 cmets 行添加第二个 LEFT JOIN 时,我最终只收到来自 news 的一行(请记住,有 2 个),并且 COUNT(cmets.id) 给了我 2(它应该显示 1,因为我有每个帖子的评论。)

我做错了什么?为什么只显示一条新闻,并说它有两个cmet,当有两条新闻,每条有一条评论时?

SELECT news.id, users.username, news.title, news.date, news.body, COUNT(comments.id)
FROM news
LEFT JOIN users
ON news.user_id = users.id
LEFT JOIN comments
ON comments.news_id = news.id

另外,为了确定另一件事,我对 cme​​ts 的左连接是获取所有帖子的正确方法,无论它们是否有 cmets,对吗?或者那将是一个正确的加入?哦,最后一件事......如果我将 cmets.news_id = news.id 切换到 news.id = cmets.news_id,我会得到 0 个结果。

【问题讨论】:

【参考方案1】:

您缺少一个 GROUP BY 子句:

SELECT news.id, users.username, news.title, news.date, news.body, COUNT(comments.id)
FROM news
LEFT JOIN users
ON news.user_id = users.id
LEFT JOIN comments
ON comments.news_id = news.id
GROUP BY news.id

左连接是正确的。如果您使用 INNER 或 RIGHT JOIN,那么您将不会获得没有 cmets 的新闻项目。

【讨论】:

您必须使用 Group By 吗?我的菜鸟双重加入不起作用,我正在尝试找出原因。 谢谢 - 它帮助我解决了一个让我花了 3 个小时难以解决的问题 - 只需几分钟就解决了【参考方案2】:

显示每个新闻帖子标题的所有详细信息,即。 "news.id" 是主键,你需要对 "news.id" 使用 GROUP BY 子句

SELECT news.id, users.username, news.title, news.date,
       news.body, COUNT(comments.id)
FROM news
LEFT JOIN users
ON news.user_id = users.id
LEFT JOIN comments
ON comments.news_id = news.id
GROUP BY news.id

【讨论】:

以上是关于MySQL 多个左连接的主要内容,如果未能解决你的问题,请参考以下文章

MySQL使用多个左连接获取重复项

如何优化 MySQL 中的多个左连接?

MySQL 性能:使用左连接的一个查询与多个查询

mysql 查询 - 使用左连接和 where 子句的多个计数

Mysql在同一张表上的多个左连接

MySQL连接查询之内连接左连接右连接自连接