在日常开发过程中难免遇到分组去重的业务场景。
比如说在门店几分流水表中统计一下各个门店的流水记录数据,包括流水记录总数和流水记录明细。那么问题来了!
首先看表结构
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;
插入几条模拟数据
如果我们想查询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
此写法简单明了,而且效率上还是比上一种高一点的。通过执行计划就可以看出。