当存在一些非NULL值时,为什么MySQL GROUP_CONCAT返回NULL

时间:2018-02-02 07:00:15

标签: mysql group-concat

以下是一些示例代码:

CREATE TABLE test (
  first_name VARCHAR(255),
  last_name VARCHAR(255)
);
INSERT INTO test (first_name) VALUES ('first_1');
INSERT INTO test (last_name) VALUES ('last_1');

SELECT GROUP_CONCAT(first_name, last_name) FROM test;
SELECT GROUP_CONCAT(first_name), GROUP_CONCAT(last_name) FROM test;

第一个选择返回null,而MySQL documentation表示如果没有非NULL值则返回null。 Here是一个演示。

2 个答案:

答案 0 :(得分:1)

预期此结果。考虑第一个查询:

SELECT GROUP_CONCAT(first_name, last_name) FROM test;

由于每条记录的名字或姓氏都有NULL,因此您要连接NULL值,然后汇总NULL,同时还会产生NULL。要更好地理解此行为,请运行查询SELECT CONCAT('Hello', NULL) FROM dual并观察输出为NULL

但是,在第二个查询中:

SELECT GROUP_CONCAT(first_name), GROUP_CONCAT(last_name) FROM test;

您是在各个上连接的组。在这种情况下,NULL值将被忽略,并且您将保留非NULL名字和姓氏的个人值。

从图中可以看出,我们可以得出以下结论:

first_name | last_name | CONCAT (first_name, last_name)
first_1    | NULL      | NULL
NULL       | last_1    | NULL
--------------------------------
first_1    | last_1    | NULL    <-- GROUP_CONCAT of columns

您可以看到记录中的GROUP_CONCAT行为与其他聚合函数类似,忽略NULL个值。但是,在之后,GROUP_CONCAT将首先进行连接,即使一个值为NULL,也会生成NULL

答案 1 :(得分:0)

使用having

SELECT
    `a`.`id`, `a`.`name`, `b`.`id` AS  `b_id`, `b`.`name` AS  `b_name`,   GROUP_CONCAT(  `c`.`l_id` ) AS  `c_ls`
FROM  
    `a`
    INNER JOIN  `b` ON  `a`.`b_id` =  `b`.`id`
    LEFT OUTER JOIN  `c` ON  `a`.`id` = `c`.`a_id`
having `a`.`id` IS NOT NULL
GROUP BY `a`.`id`
ORDER BY `a`.`created` DESC