当需要使用 SQL 进行数据分页,并需要前端显示总条数,总页数,进行翻页跳转时。我们都知道需要使用 count 函数进行总条数的计算。
那么,抛出一个可能会产生疑问的问题:
进行 count 计算总条数的时候,还需要带上 group by 子句吗?
这其实是我自己在开发过程中产生的疑惑,写着写着代码,突然不知道有没有必要加 group by 那玩意了。
知道加上 group by 肯定是对的,但是到底有没有必要呢?
我为什么会对此疑惑呢?
有两个原因:
- 记忆中,在哪里看到过有个说法,count 的时候,不需要带 group by 字句,具体哪里看到的忘记了,也有可能是纯癔想的?
- 在项目代码里,确实看到有这种写法了。查分页数据的时候带有 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 条数据。
我们写的查询每页数据的 sql 是这个样子(省略了分页 limit 子句)。
SELECT
`from` 用户,
count( * ) 关注人数
FROM
follow_record
GROUP BY
`from`;
得出的结果是这样:得到用户,以及对应的关注人数列表。
我们可以看到有 2 条结果数据。
因为数据量很少,其实从上面这条 sql 上看,我们已经可以看到总条数了,2 条,是吧,那么我们预期的 count 应该也是 2才对。
那么如果我们执行 count 计算总条数的时候,如果不带 group by 子句,显现会得到 count 为 5,显然这种是错误的。
结果如下:
所以,正确的计算总条数的 count 写法,是需要带上 group by 子句的。否则得出的数据是不准确的!
over,就这么简单的一件事情竟然会让我产生疑问???