Vấn đề
GROUP_CONCAT mặc định bỏ qua giá trị NULL, nhưng giữ chuỗi rỗng '' → tạo ra dấu phân cách kép (,,) khi có nhiều chuỗi rỗng liên tiếp. Cần thay ',,' thành ',' đơn.
Ví dụ minh họa
Tạo bảng và chèn dữ liệu (có chuỗi rỗng)
mysql> CREATE TABLE DemoTable (
Id INT,
Number VARCHAR(100)
);
mysql> INSERT INTO DemoTable VALUES (10, '456'), (11, '345'), (10, ''), (10, '278'), (10, ''), (10, '789');
Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+------+--------+ | Id | Number | +------+--------+ | 10 | 456 | | 11 | 345 | | 10 | | | 10 | 278 | | 10 | | | 10 | 789 | +------+--------+
Truy vấn GROUP_CONCAT + REPLACE
mysql> SELECT Id, REPLACE(GROUP_CONCAT(Number), ',,', ',') FROM DemoTable GROUP BY Id;
Kết quả
+------+----------------------------------------+ | Id | REPLACE(GROUP_CONCAT(Number), ',,', ',') | +------+----------------------------------------+ | 10 | 456,278,789 | | 11 | 345 | +------+----------------------------------------+
Giải thích
GROUP_CONCAT(Number)cho Id=10 tạo ra: '456,,278,,789' (chuỗi rỗng tạo ',,').REPLACE(..., ',,', ',')gộp dấu phẩy kép thành đơn.
⚠️ Vấn đề: Nhiều chuỗi rỗng liên tiếp > 2
Nếu có 3 chuỗi rỗng: '456,,,278' → REPLACE 1 lần chỉ thành '456,,278' (còn lại 1 cặp).
Giải pháp mạnh hơn: Lọc trước khi GROUP_CONCAT
SELECT Id, GROUP_CONCAT(Number) FROM (SELECT Id, Number FROM DemoTable WHERE Number <> '' AND Number IS NOT NULL) t GROUP BY Id;
Hoặc MySQL 8.0:
SELECT Id, GROUP_CONCAT(NULLIF(TRIM(Number), '')) FROM DemoTable GROUP BY Id;
NULLIF chuyển chuỗi rỗng thành NULL, GROUP_CONCAT bỏ qua NULL.
Lưu ý GROUP_CONCAT
- Mặc định max length 1024 byte. Tăng:
SET SESSION group_concat_max_len = 1000000; - Sắp xếp trong group:
GROUP_CONCAT(Number ORDER BY Number). - Dấu phân cách tùy chỉnh:
GROUP_CONCAT(Number SEPARATOR ';').