MySQL SELECT语句仅返回一行

4
自从上次提问以来已经过了相当长一段时间,但我一直在尝试使用SQL构建自己的论坛系统时遇到了问题。
我的问题背景是,我正在尝试创建一个函数来显示最受欢迎的主题,这取决于其拥有的回复数以及最新回复的时间。
通过一些阅读,我制作了这个SQL语句。
SELECT 
topics.id, 
topics.authorID,
topics.lastReply
FROM 
ms_topics as topics
INNER JOIN
(SELECT inTopic FROM ms_posts) as rcount
ON
rcount.inTopic = topics.id
ORDER BY
topics.lastReply DESC,
count(rcount.inTopic)

然后我使用PDO的fetchAll()函数将结果存储到一个变量中。
$GetPopular = $db->prepare('SQL Statement Above');
$GetPopular->execute();
$Populars = $GetPopular->fetchAll();

为了解决问题,我使用var_dump()$populars进行故障排除,结果只返回数据库中的一行。
array(1) { [0]=> array(3) { ["id"]=> string(1) "4" ["authorID"]=> string(1) "1" ["lastReply"]=> string(19) "2014-06-08 19:49:50" } }

我的问题基本上是这样的:为什么它不能返回多行,我该如何让它返回多行?
1个回答

3
你使用了连接子查询是正确的,但你需要在子查询中应用COUNT()函数。否则,聚合函数会应用于外部查询,导致只返回一行结果。
这是因为你没有使用GROUP BY,MySQL对此比较宽松。它会返回一个不完全符合你期望的结果,而其他大多数关系型数据库管理系统则会返回解析错误。否则,如果没有使用GROUP BY的聚合函数(COUNT()、MIN()、MAX()、SUM()等),将永远不会返回超过一行的结果。
SELECT 
  topics.id, 
  topics.authorID,
  topics.lastReply,
  postsInTopic
FROM 
  ms_topics as topics
  /* The subquery provides the aggregate count
     grouped per inTopic */
  INNER JOIN (
    SELECT
     inTopic,
     COUNT(*) AS postsInTopic
   FROM ms_posts
   GROUP BY inTopic
  ) as rcount ON rcount.inTopic = topics.id
ORDER BY
  topics.lastReply DESC,
  /* Use the alias from the subquery postsInTopic to srot */
  postsInTopic

关于PDO和prepare()的快速说明:虽然它已经成为你工作流程中一个好的选择,但如果你的查询没有输入值(例如没有动态的WHERE子句),使用prepare()/execute()不是必需的。对于像这样的静态查询,在这种情况下,您可以安全地调用PDO::query(),这样可以减少开销并减少一些代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接