ChatGPT解决这个技术问题 Extra ChatGPT

MySQL 多个左连接

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

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

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

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

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

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


M
Mark Byers

您缺少 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,那么您将不会获得没有评论的新闻项目。


您必须使用 Group By 吗?我的菜鸟双重加入不起作用,我正试图找出原因。
谢谢 - 它帮助我解决了一个让我花 3 个小时难以解决的问题 - 只需几分钟即可解决
r
rizon

显示每个新闻帖子标题的所有详细信息,即。 "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