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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM