【问题标题】:Aggregate rows in MySQL ignoring NULL values into a single row将忽略 NULL 值的 MySQL 中的行聚合为一行
【发布时间】:2019-05-11 06:07:34
【问题描述】:

给定一张桌子

id  date        job    color  qty
1   2018-12-10  12345  green  1
2   2018-12-11  12345        
3   2018-12-15  12345       
4   2018-12-21  12345  red    
5   2018-12-21  12345         4
6   2018-12-22  12345

id 列是自动递增的,是表的主键。

一个简单的查询

SELECT * FROM `table` WHERE `job` = '12345' ORDER BY `id` ASC;

将按插入顺序返回作业12345 的所有记录。

问题: 如何查询表以仅返回包含每列最新值的单行?

所需的行看起来像这样

6   2018-12-22  12345  red    4         

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可以使用单独的子查询来查找每个单独列中的最大值:

    SELECT
        (SELECT MAX(id) FROM yourTable) AS id,
        (SELECT MAX(date) FROM yourTable) AS date,
        (SELECT MAX(job) FROM yourTable) AS job,
        (SELECT MAX(color) FROM yourTable) AS color,
        (SELECT MAX(qty) FROM yourTable) AS qty;
    

    Demo

    我不知道您为什么要这样做,这可能表明您的数据库设计/规划不佳。

    【讨论】:

    • 问题不是每组最高n个问题:-) 请再次查看样本数据和预期输出。
    • @MadhurBhaiya 我期待你出现,我的基地也是如此。准备好让 OP 改变问题:-)
    • OP 希望为每一列选择最高值并将它们组合成一个“假”行
    【解决方案2】:

    在查询中使用 LIMIT

    SELECT * FROM `table` WHERE `job` = '12345' ORDER BY `id` DESC LIMIT 1;
    

    【讨论】:

      【解决方案3】:

      一种方法是使用Group_Concat()Substring_Index() 来提取最新的非空值。 GROUP_CONCAT() 将忽略 null 值。

      SELECT 
        MAX(id) AS id, 
        MAX(date) AS date, 
        MAX(job) AS job, 
        SUBSTRING_INDEX(GROUP_CONCAT(color ORDER BY id DESC), ',', 1) AS color, 
        SUBSTRING_INDEX(GROUP_CONCAT(qty ORDER BY id DESC), ',', 1) AS qty 
      FROM `table` 
      WHERE `job` = '12345';
      

      上述查询中的一个假设是date 的最大值对应于id 的最大值。

      另外,因为我们只关心“最新”值(只获取一个值);我们将不受group_concat_max_len 变量的限制。

      【讨论】:

        【解决方案4】:

        您可以使用子查询来获得所需的结果:

        select max(id) id, 
               job, 
               max(`date`) `date`,
              (select qty from tbl
              where qty is not null
               and tbl.job = job
              order by `date` desc
              limit 1) qty,
              (select color from tbl
              where color is not null
                and tbl.job = job
              order by `date` desc
              limit 1) color
        from tbl
        group by job
        

        【讨论】:

          猜你喜欢
          • 2019-01-21
          • 1970-01-01
          • 1970-01-01
          • 2017-07-27
          • 2016-10-20
          • 1970-01-01
          • 2014-04-19
          • 1970-01-01
          • 2019-08-03
          相关资源
          最近更新 更多