作用
GROUP_CONCAT 是 MySQL 中用於將查詢結果集中的多行資料合併為單個字串的聚合函式。它將每行資料的指定欄位值連線起來,並以指定的分隔符分隔,最終返回一個包含所有值的字串。
以下是 GROUP_CONCAT 函式的一般語法:
SELECT GROUP_CONCAT(column_name SEPARATOR ', ') FROM table_name GROUP BY group_column;
- column_name:要連線的欄位名。
- SEPARATOR:可選引數,用於指定連線不同值時使用的分隔符,預設為逗號。
- table_name:表名。
- group_column:分組列,用於指定對哪個列進行分組。
效能問題
- 記憶體消耗:
GROUP_CONCAT
可能導致記憶體消耗較大,特別是在處理大量資料時,需要注意記憶體使用情況。 - 字串長度限制:預設情況下,
GROUP_CONCAT
返回的字串長度有限制(預設為1024位元組),如果超出限制會截斷字串。可以透過設定group_concat_max_len
引數調整最大長度。 - 效能最佳化:對於大資料量的情況,可以考慮透過增加
group_concat_max_len
的值或者拆分查詢來提高效能。另外,避免在大表上頻繁使用GROUP_CONCAT
也是一種最佳化策略。 - 索引利用:在使用
GROUP_CONCAT
時,確保相關欄位有索引,可以提高查詢效率。
總的來說,GROUP_CONCAT
在某些場景下非常方便,但在處理大量資料時需要注意潛在的效能問題,合理使用並結合其他最佳化手段可以提升查詢效率。希望這些資訊對你有所幫助。如果有其他問題,請隨時告訴我。
業務場景
- 有表business_function,表示一個功能
- 有表business_function_product_r,表示這個功能所屬於的產品列表
- 一個功能可以對應多個產品
- 如果直接使用left join組合的話,如果遇到多個產品關係時,會一個功能多條記錄,這在分頁時,會有問題
GROUP_CONCAT和FIND_IN_SET實現組合和檢索
select a.id,
a.title,
a.title_eng,
a.code,
a.description,
a.is_display,
a.is_enable,
a.category_id,
GROUP_CONCAT(r.product_id) AS functions
from business_function a
left join business_function_product_r r on a.id = r.function_id
group by a.id,
a.title,
a.title_eng,
a.code,
a.description,
a.is_display,
a.is_enable,
a.category_id
HAVING FIND_IN_SET(4, functions) > 0
分組並進行行轉列的結果會在functions列,每個值用逗號分開