首页 > 解决方案 > 将忽略 NULL 值的 MySQL 中的行聚合为一行

问题描述

给定一张桌子

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

解决方案


一种方法是使用Group_Concat()withSubstring_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变量的限制。


推荐阅读