使用Count函数时,Mysql仅返回一行

13

我刚刚遇到了一个奇怪的行为,以前从未见过或者没有注意到。

我正在使用这个查询:

  SELECT *, 
         COUNT(*) AS pages 
    FROM notis 
   WHERE cid = 20 
ORDER BY nid DESC 
   LIMIT 0, 3

我想读取3个项目并获取总行数。

问题是...

...当我使用count时,查询只返回一行,但如果我删除COUNT(*) AS pages,我会得到三行,这显然有些错误。


1
你需要类似于窗口函数的东西,但不幸的是MySQL不支持。你将不得不执行两个单独的查询。 - Pablo Santa Cruz
1
即使如此,这些数据也不属于同一类别。他实际上要求的是类似于“对于第20个部门的前三个人,给我他们的名字和姓氏以及第20个部门的总人数。” 是的,你可以这样问,但这样问没有意义,因为你会得到第20个部门的总人数三次。 - McKay
这真的是一个很愚蠢的问题吗?在我看来,询问部门中的总人数并获取“移入”的前3个人的信息是相当合理的。 - Breezer
@Breezer,然后请求: select count(*) from notis where cid =20; select * from notis where cid=20 limit 0,3 - McKay
@Breezer,你在请求两个不同的数据。请分别请求它们,不要试图将它们合并成一个查询,这样是没有意义的。 - McKay
是的,我现在明白了,但我希望不需要再次对数据库进行两个查询。 - Breezer
3个回答

17

是的,count是一个聚合操作符,如果没有group by子句,它只会返回一行。

也许可以进行两个单独的查询?将数据行和总行数返回在一起没有意义,因为这些数据不属于同一组。

如果你真的非常想要,可以像这样做:

SELECT *, (select count(*) FROM notis WHERE cid=20) AS count FROM notis WHERE cid=20 ORDER BY nid DESC LIMIT 0,3

或者这种方式:

SELECT N.*, C.total from notis N join (select count(*) total FROM notis WHERE cid=20) C WHERE cid=20) AS count FROM notis WHERE cid=20 ORDER BY nid DESC LIMIT 0,3

具体嵌套表达式的差异取决于您使用的SQL方言。


1
是的,这似乎是最后的办法,需要进行两次调用。谢谢。 - Breezer

14

如果不使用 GROUP BY,使用聚合函数总是会返回一行结果。如果想要返回多行结果,必须使用 GROUP BY。

请注意,在大多数关系型数据库管理系统上,这样的查询将失败,因为它没有意义。


1
但如果我使用 group by,计数函数返回 1 作为结果。 - Breezer
是的,正如Pablo Santa Cruz所说,您需要使用窗口函数,但MySQL不支持它。您将需要执行2个查询。 - Vincent Savard

3

这种方法效率低下,但是可以工作:

SELECT 
   *,
   (SELECT COUNT(*) FROM notis WHERE cid=20) AS pages
FROM notis 
WHERE cid=20 
ORDER BY nid DESC 
LIMIT 0,3

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