MySQL分组聚合group_concat + substr_index

场景:
给予一张商品售卖表,表中数据为商品的售卖记录,假设表中数据是定时脚本插入的,每个时间段的商品售卖数量不同,根据此表找各个商品的最多售卖数量的数据

1、数据表

CREATE TABLE `goods_sell` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `goods_id` int(10) unsigned NOT NULL DEFAULT '0',
  `sell_num` int(10) unsigned NOT NULL DEFAULT '0',
  `create_time` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

2、数据内容

mysql> select * from goods_sell;
+----+----------+----------+-------------+
| id | goods_id | sell_num | create_time |
+----+----------+----------+-------------+
|  1 |        1 |        5 |  1420520010 |
|  2 |        2 |       10 |  1420520000 |
|  3 |        1 |       10 |  1410520000 |
|  4 |        1 |        5 |  1510520000 |
|  5 |        2 |        6 |  1510521000 |
|  6 |        3 |       15 |  1510621000 |
+----+----------+----------+-------------+
6 rows in set (0.00 sec)

剖析其要求,也就是说,要用1条sql
找出goods_id 为1 的id为4的数据
找出goods_id 为2 的id为2的数据
找出goods_id 为3 的id为6的数据

3、怎么做呢?
这时就可以用MySQL的分组聚合,GROUP_CONCAT和SUBSTRING_INDEX一起使用。
#查找各个商品售卖最多的一条记录,此时group_concat()中一定要order by排序。要不然截取第一个数据就不对了。

select id,goods_id,
SUBSTRING_INDEX(GROUP_CONCAT(sell_num order by sell_num desc),',',1) sell_num_max,
create_time 
from goods_sell group by goods_id order by create_time DESC;

+----+----------+--------------+-------------+
| id | goods_id | sell_num_max | create_time |
+----+----------+--------------+-------------+
|  6 |        3 | 15           |  1510621000 |
|  1 |        1 | 10           |  1420520010 |
|  2 |        2 | 10           |  1420520000 |
+----+----------+--------------+-------------+
3 rows in set (0.00 sec)

不使用SUBSTRING_INDEX的话,查出来的数据是:

select id,goods_id, GROUP_CONCAT(sell_num order by sell_num desc) sell_num_list, create_time  from good;

+----+----------+---------------+-------------+
| id | goods_id | sell_num_list | create_time |
+----+----------+---------------+-------------+
|  6 |        3 | 15            |  1510621000 |
|  1 |        1 | 10,5,5        |  1420520010 |
|  2 |        2 | 10,6          |  1420520000 |
+----+----------+---------------+-------------+
3 rows in set (0.00 sec)

所以用SUBSTRING_INDEX截取最前面的一个数据。

文档参考:
https://www.cnblogs.com/zhwbqd/p/4205821.html
https://blog.csdn.net/m0_37797991/article/details/80511855
https://baijiahao.baidu.com/s?id=1595349117525189591&wfr=spider&for=pc

 

posted @ 2019-06-24 17:10  弍月关  阅读(1242)  评论(0编辑  收藏  举报