[英]Why MySQL GROUP_CONCAT returns NULL when there are some non-NULL values
下面是一些示例代碼:
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;
這個結果在意料之中。 考慮第一個查詢:
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
。
使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.