首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL GROUP_CONCAT 實現按字段分類聚合輸出:字符串拼接與應用層解析

     編輯:MySQL 資料庫相關知識

業務場景

表 area 包含 area (區域名)、serialize (分類首字母) 字段。需輸出:

serialize | areas
A         | 阿藍色,艾沙雲
C         | 重慶森林,傳承家園
H         | 紅軍樓小區,海員新村
...

核心 SQL

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:按分類字段分組聚合

應用層解析 (PHP 示例)

$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 "
"; }

GROUP_CONCAT 限制與調優

限制默認值調整方法
單組最大長度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 ',')

避坑指南

  1. 大數據量慎用:百萬行分組拼接極耗內存/臨時表,優先應用層分批查詢組裝
  2. NULL 值處理:GROUP_CONCAT 自動忽略 NULL,若需保留用 COALESCE(area, 'NULL')
  3. 分隔符衝突:數據含逗號時改用 SEPARATOR '|' 或其他罕見字符
  4. 排序成本:ORDER BY 在組內觸發 filesort,大組建議索引覆蓋

總結

GROUP_CONCAT + GROUP BY 是 MySQL 實現「分類聚合字符串拼接」的標準利器。配合 ORDER BY、SEPARATOR、DISTINCT 參數,可覆蓋 90% 的報表輸出、下拉選項生成、標籤雲構建等場景。注意 group_concat_max_len 限制,大數據量場景轉移到應用層流式處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved