MySQL多个左连接
我正在尝试为正在处理的网站创build一个新闻页面。 我决定,我想使用正确的MySQL查询(意思是COUNT(id)和连接,而不是多个查询或num_rows。)我正在使用一个PDO包装,应该正常工作,这仍然失败,直接通过MySQL CLI应用程序。
基本上,我有3桌子。 一个持有消息,一个持有评论,一个持有用户。 我的目标是创build一个页面,显示所有(稍后分页)新闻标题,正文,作者和date。 这工作得很好,当我用第二个查询来获得用户名,但后来我决定我宁愿使用JOIN。
所以有什么问题? 那么,我需要两个连接。 一个是获取作者的用户名,另一个是获取评论的数量。 当我只是去作者的用户名,所有的预期工作。 显示新闻表中的所有行(有2个)。 然而,当我为评论行添加第二个LEFT JOIN时,我最终只收到一条来自新闻的logging(记住,有2个)和COUNT(comments.id)给我2(它应该显示1,因为我有每个post的评论。)
我究竟做错了什么? 为什么它只显示一个新闻post,并说有两个评论,有两个新闻post,每个都有一个评论?
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
另外,为了确定另一件事情,我左边的评论是正确的方式来获得所有职位,无论他们是否有意见或不正确的? 或者这是一个正确的join? 哦,最后一件事…如果我将news.news_id = news.id切换到news.id = comments.news_id,我会得到0个结果。
你错过了一个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,那么您不会收到没有评论的新闻。
要显示每个新闻标题的所有细节,即。 “news.id”是主键,你需要使用GROUP BY子句作为“news.id”
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