在MySQL中将忽略NULL值的行聚合为单行

时间:2018-12-10 10:43:41

标签: 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         

4 个答案:

答案 0 :(得分:2)

一种方法是将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变量的限制。

答案 1 :(得分:0)

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

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;

enter image description here

Demo

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

答案 2 :(得分:0)

在查询中使用LIMIT作为

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

答案 3 :(得分:0)

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

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