MENU

MySQL中使用count与group by 的统计问题

November 5, 2020 • MySQL

在日常开发过程中难免遇到分组去重的业务场景。

比如说在门店几分流水表中统计一下各个门店的流水记录数据,包括流水记录总数和流水记录明细。那么问题来了!

首先看表结构

CREATE TABLE `shop_point` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `shop_id` int(11) NOT NULL DEFAULT '0',
  `point` int(11) DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入几条模拟数据

95Ty.png

如果我们想查询1号门店的数据列表,那么很自然的会写出下面的sql语句

SELECT * FROM `shop_point` WHERE shop_id = 1 

那这个时候记录总数该如何算呢,因为会牵扯到分页逻辑。

所以,这就是今天想说的问题。

首先,简单粗暴的方法就是直接查询说所有的记录,然后用程序进行数组大小计算。不过在数据量较小的情况下还是可以临时用一下的。因为数组非常大的情况下,第一查询速度会特别慢,第二就算查出来以后代码进行计算有可能也会内存溢出。

不妨试一试下面的sql语句

SELECT count(*) FROM (SELECT shop_id FROM shop_point GROUP BY shop_id) t

这样会直接返回记录的数值。

注意最后面的那个t不可以省略,需要定义一个别名,不一定叫t也可以是其他字符。

从上面的语句可以看出,使用group by后统计到的是分组后的结果集,然后再在外面套一层count就得到了最终想要的记录总数。

不过在和朋友讨论后发现还有一种写法也可以实现上面的需求,直接贴一下语句

SELECT COUNT(DISTINCT shop_id) FROM shop_point

此写法简单明了,而且效率上还是比上一种高一点的。通过执行计划就可以看出。

9Xza.png

9MbJ.png