GroupConcat中缺少空值

时间:2020-06-02 07:26:44

标签: mysql group-by group-concat

我有一个表,用于在事件开始和结束时在其中注册。我需要一个在我的日期范围之间结束或正在进行的事件的列表,但是那些尚未结束的事件是错误的,因为在组concat中缺少空值。

如何通过entity_id分组来获取空值?

| id | entity_id | start                | end                  |
|----|-----------|----------------------|----------------------|
| 1  | 10        | 2020-05-22T23:50:00Z | 2020-05-23T00:15:00Z |
| 2  | 20        | 2020-05-22T23:30:00Z | 2020-05-23T00:50:00Z |
| 3  | 10        | 2020-05-23T01:00:00Z | 2020-05-23T01:10:00Z |
| 4  | 20        | 2020-05-23T01:30:00Z | 2020-05-23T01:50:00Z |
| 5  | 20        | 2020-05-23T02:00:00Z | null                 |
| 6  | 10        | 2020-05-23T05:00:00Z | null                 |

我的查询:

SELECT entity_id,   
SUBSTRING_INDEX(GROUP_CONCAT(`start` ORDER BY `start` DESC SEPARATOR '||'), '||', 1) AS `start`,
SUBSTRING_INDEX(GROUP_CONCAT(`end` ORDER BY `start` DESC SEPARATOR '||'), '||', 1) AS `end`
FROM my_table
WHERE `start` <= '2020-05-23 23:59:59'  
AND ( `end` IS NULL OR `end` BETWEEN '2020-05-23 00:00:00' AND '2020-05-23 23:59:59' )
GROUP BY entity_id ;

这是查询结果

| entity_id | start               | end                 |
|-----------|---------------------|---------------------|
| 10        | 2020-05-23 05:00:00 | 2020-05-23 01:10:00 |
| 20        | 2020-05-23 02:00:00 | 2020-05-23 01:50:00 |

但这应该是

| entity_id | start               | end                 |
|-----------|---------------------|---------------------|
| 10        | 2020-05-23 05:00:00 | null                |
| 20        | 2020-05-23 02:00:00 | null                |

我创建了一个示例:http://sqlfiddle.com/#!9/e04be2/1/0

1 个答案:

答案 0 :(得分:2)

GROUP_CONCAT()跳过NULL个值。

您可以使用IFNULL将空值转换为显式字符串'null'

SELECT entity_id,   
SUBSTRING_INDEX(GROUP_CONCAT(`start` ORDER BY `start` DESC SEPARATOR '||'), '||', 1) AS `start`,
SUBSTRING_INDEX(GROUP_CONCAT(IFNULL(`end`, 'null') ORDER BY `start` DESC SEPARATOR '||'), '||', 1) AS `end`
FROM my_table
WHERE `start` <= '2020-05-23 23:59:59'  
AND ( `end` IS NULL OR `end` BETWEEN '2020-05-23 00:00:00' AND '2020-05-23 23:59:59' )
GROUP BY entity_id ;