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

作用

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列,每個值用逗號分開

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章