簡體   English   中英

為什么 MySQL GROUP_CONCAT 在有一些非 NULL 值時返回 NULL

[英]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;

第一個選擇返回 null,而 MySQL 文檔指出,如果沒有非 NULL 值,它返回 null。 是一個演示。

這個結果在意料之中。 考慮第一個查詢:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM