我正在尝试为我正在处理的网站创建新闻页面。我决定使用正确的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结果。
答案 0 :(得分:98)
您缺少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,那么您将无法获得没有评论的新闻项目。
答案 1 :(得分:7)
显示每个新闻帖标题的所有详细信息,即。 “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