mysql分组index_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',PRIMARYKEY(`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截取最前面的一个数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值