2010-01-02 124 views
42

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

基本上我有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 

而且,只是为了确保有关的另一件事,我的左边加盟的评论是让所有的职位,无论他们是否有意见或不正确的方式,正确的吗?或者这是一个正确的加入?哦,最后一件事......如果我将news.news_id = news.id切换到news.id = comments.news_id,我会得到0个结果。

回答

80

你缺少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,那么你不会收到没有评论的新闻。

+0

你有没有使用GROUP BY子句?我的菜鸟双连接不起作用,我试图找出原因。 – 2014-06-13 21:51:35

+0

谢谢 - 它帮助我解决了一个难以花费3个小时的问题 - 只需几分钟即可解决问题 – Muhammad 2015-05-06 19:07:13

+0

非常感谢。也解决了我的问题:)。 – C4u 2016-02-05 10:03:08

7

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