mysql~GROUP_CONCAT實現關係表的行轉列

张占岭發表於2024-04-12

作用

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:分組列,用於指定對哪個列進行分組。

效能問題

  1. 記憶體消耗GROUP_CONCAT 可能導致記憶體消耗較大,特別是在處理大量資料時,需要注意記憶體使用情況。
  2. 字串長度限制:預設情況下,GROUP_CONCAT 返回的字串長度有限制(預設為1024位元組),如果超出限制會截斷字串。可以透過設定 group_concat_max_len 引數調整最大長度。
  3. 效能最佳化:對於大資料量的情況,可以考慮透過增加 group_concat_max_len 的值或者拆分查詢來提高效能。另外,避免在大表上頻繁使用 GROUP_CONCAT 也是一種最佳化策略。
  4. 索引利用:在使用 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列,每個值用逗號分開

相關文章