表 area 包含 area (區域名)、serialize (分類首字母) 字段。需輸出:
serialize | areas
A | 阿藍色,艾沙雲
C | 重慶森林,傳承家園
H | 紅軍樓小區,海員新村
...
SELECT
`serialize`,
GROUP_CONCAT(`area` ORDER BY `area` SEPARATOR ',') AS `areas`
FROM `area`
GROUP BY `serialize`
ORDER BY `serialize`;
ORDER BY area:組內排序,輸出穩定可預期SEPARATOR ',':自定義分隔符,默認逗號GROUP BY serialize:按分類字段分組聚合$rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
$letter = $row['serialize'];
$areas = explode(',', $row['areas']); // 分割為數組
// 輸出或模板渲染
echo "$letter
";
foreach ($areas as $area) {
echo "- $area
";
}
echo "
";
}
| 限制 | 默認值 | 調整方法 |
|---|---|---|
| 單組最大長度 | 1024 字節 (group_concat_max_len) | SET SESSION group_concat_max_len = 1024000; |
| 結果截斷 | 超長度靜默截斷 | 查詢前檢查 SELECT SUM(LENGTH(area))+COUNT(*) FROM area GROUP BY serialize |
GROUP_CONCAT(DISTINCT `area` ORDER BY `area` SEPARATOR ',')
GROUP_CONCAT(CONCAT(`area`, ':', `code`) ORDER BY `area` SEPARATOR ';')
GROUP_CONCAT(CASE WHEN `status`=1 THEN `area` END ORDER BY `area` SEPARATOR ',')
GROUP_CONCAT 自動忽略 NULL,若需保留用 COALESCE(area, 'NULL')SEPARATOR '|' 或其他罕見字符ORDER BY 在組內觸發 filesort,大組建議索引覆蓋GROUP_CONCAT + GROUP BY 是 MySQL 實現「分類聚合字符串拼接」的標準利器。配合 ORDER BY、SEPARATOR、DISTINCT 參數,可覆蓋 90% 的報表輸出、下拉選項生成、標籤雲構建等場景。注意 group_concat_max_len 限制,大數據量場景轉移到應用層流式處理。