• 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

  • 相关阅读:
    POJ NOI0113-05 素数回文数的个数(PKU2928)
    POJ NOI0113-04 垂直直方图(PKU2800)
    POJ NOI0113-03 八进制小数(PKU2765)
    UVALive2245 POJ1131 HDU1376 ZOJ1086 Octal Fractions【进制】
    HDU2708 Vertical Histogram
    POJ2136 Vertical Histogram【打印图案】
    POJ2190 HDU2714 ISBN
    POJ NOI0113-02 不吉利日期(PKU2723)
    POJ NOI0113-01 数制转换(PKU2710)
    POJ NOI MATH-7828 最大公约数与最小公倍数
  • 原文地址:https://www.cnblogs.com/deverz/p/11078169.html
Copyright © 2020-2023  润新知