MySQL count 需要带上 group by 子句吗?

当需要使用 SQL 进行数据分页,并需要前端显示总条数,总页数,进行翻页跳转时。我们都知道需要使用 count 函数进行总条数的计算。

那么,抛出一个可能会产生疑问的问题:
进行 count 计算总条数的时候,还需要带上 group by 子句吗?

这其实是我自己在开发过程中产生的疑惑,写着写着代码,突然不知道有没有必要加 group by 那玩意了。

知道加上 group by 肯定是对的,但是到底有没有必要呢?

我为什么会对此疑惑呢?

有两个原因:

  1. 记忆中,在哪里看到过有个说法,count 的时候,不需要带 group by 字句,具体哪里看到的忘记了,也有可能是纯癔想的?
  2. 在项目代码里,确实看到有这种写法了。查分页数据的时候带有 group by 子句,但是计算总条数的时候又不带 group by 子句了,看到这种使用方式,我确实疑惑了,到底有没有必要?

不管传说中是否有这样一个问题,那么今天,我要记录个结论。

答案是:**需要!**请不要再和我一样疑惑。


下面看看具体的假例子,从数据上反推一下错误的使用方式:

场景重现:我们需要从一张关注表里,取出每个人的关注人数,并分页展示。

看看表结构

CREATE TABLE `follow_record` (
  `id` int(11) NOT NULL,
  `from` int(11) DEFAULT NULL COMMENT '关注方id',
  `to` int(11) DEFAULT NULL COMMENT '被关注方id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='关注记录表';

初始化数据如下:

我们可以看到有 5 条数据。

image-20210803232849308

我们写的查询每页数据的 sql 是这个样子(省略了分页 limit 子句)。

SELECT
	`from` 用户,
	count( * ) 关注人数
FROM
	follow_record 
GROUP BY
	`from`;

得出的结果是这样:得到用户,以及对应的关注人数列表。

我们可以看到有 2 条结果数据。

image-20210803233108023

因为数据量很少,其实从上面这条 sql 上看,我们已经可以看到总条数了,2 条,是吧,那么我们预期的 count 应该也是 2才对。

那么如果我们执行 count 计算总条数的时候,如果不带 group by 子句,显现会得到 count 为 5,显然这种是错误的。

结果如下:

image-20210803234114339

所以,正确的计算总条数的 count 写法,是需要带上 group by 子句的。否则得出的数据是不准确的!


over,就这么简单的一件事情竟然会让我产生疑问???

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值