MySQL如何分組拼接字符串?


參考站:https://blog.csdn.net/qq_35067322/article/details/104218222

 


新需求來了,靜悄悄的來了! ! ! 領導想要查看每個 performance 下都有誰,同時要求將這些人的名稱要逗號拼接成一個字符串,也就是說要得到下面的結果:

要將結果集中某個指定的列進行字符串拼接,這要怎么做呢?主角閃亮✨登場

GROUP_CONCAT(expr)

在 Mysql 官方文檔 中,該函數被放在聚合函數章節,如果你要按照指定字段分組拼接,就要配合關鍵字 GROUP BY 來使用的

定義

該函數返回一個字符串結果,該字符串結果是通過分組串聯的非NULL值。如果沒有非NULL值,則返回NULL。完整語法如下:

  1.  
    GROUP_CONCAT([DISTINCT] expr [,expr ...]
  2.  
    [ORDER BY {unsigned_integer | col_name | expr}
  3.  
    [ASC | DESC] [,col_name ...]]
  4.  
    [SEPARATOR str_val])

What?  這個語法看着太復雜了吧,別着急,下面會用例子慢慢說明逐一驗證滴

使用案例

先完成文章開頭的需求:

  1.  
    SELECT performance, GROUP_CONCAT(employee_name)
  2.  
        FROM employees
  3.  
    GROUP BY performance;

zou是這個結果:

到這里,領導給過來的需求就完成了????

客官請留步,您點的菜還沒上完呢......

我們是國際化的團隊,我們的家鄉遍布五湖四海

領導想關懷一下員工,要查看公司全部員工的家鄉都有哪些地方。員工們可能來自同一個地方,所以要將結果集去重復,DISTINCT 關鍵字就派上用場了

  1.  
    SELECT GROUP_CONCAT(DISTINCT home_town)
  2.  
        FROM employees;

來看結果:

領導的關懷遍布五湖四海啊......

文案要改了,領導的關懷是遍布四海五湖的, 那么 ORDER BY 關鍵字就派上用場了

  1.  
    SELECT GROUP_CONCAT(DISTINCT home_town ORDER BY home_town DESC) AS '領導關懷地區'
  2.  
        FROM employees;
  3.  
     
  4.  
    -- 沒我這么起變量的哈,還是漢語,我看你是瘋了

這里你看到 GROUP_CONCAT 函數拼接字符串默認的分隔符是逗號 ,, 領導不開心,逗號么的感情,要用❕才能體現出關懷的強烈, SEPARATOR 關鍵字就派上用場了

分組拼接的值之間默認分隔符是逗號(,)。要明確指定分隔符,需要使用 SEPARATOR 關鍵字,緊跟其后的是你想設置的分隔符。要完全消除分隔符,就在 SEPARATOR 關鍵字后面寫  '' 就好了

  1.  
    SELECT GROUP_CONCAT(DISTINCT home_town ORDER BY home_town DESC SEPARATOR '!') AS '領導關懷地區'
  2.  
        FROM employees;
  1.  
    SELECT GROUP_CONCAT(DISTINCT home_town SEPARATOR '') AS '領導關懷地區'
  2.  
        FROM employees;


這關懷到位了吧,你品,你細品! ! !

領導的關懷能力也有限,拼接的字符串默認的最大長度是1024個字符,可以通過下面語句查看當前限制是多少:

show  variables  like 'group_concat_max_len';
 

領導的能力可是飄忽不定的,所以我們可以靈活的設置這個值

SET [GLOBAL | SESSION] group_concat_max_len = val;
 
  • SESSION: 在當前對話中生效

  • GLOBAL:全局都生效

該語句在執行后,MySQL重啟之前一直有作用,一旦重啟 MySQL,則會恢復默認值

有時候 GROUP_CONCAT()  還要搭配 CONCAT_WS() 發揮出一點點威力,舉個簡單的例子

將消費者的名和姓用逗號進行分隔,然后再用 ; 進行分隔

  1.  
    SELECT
  2.  
    GROUP_CONCAT(
  3.  
    CONCAT_WS( ', ', contactLastName, contactFirstName)
  4.  
    SEPARATOR ';')
  5.  
    FROM
  6.  
    customers;

這里是 CONCAT_WS()函數用法, 很簡單,請自行查看吧......

注意⚠️

GROUP_CONCAT()函數返回單個字符串,而不是值列表。這意味着我們不能在 IN 運算符中使用GROUP_CONCAT()函數的結果,例如,在子查詢中, 像這樣:

  1.  
    SELECT
  2.  
    id, name
  3.  
    FROM
  4.  
    table_name
  5.  
    WHERE
  6.  
    id IN GROUP_CONCAT(id);

總結

在許多情況下,我們都可以應用GROUP_CONCAT()函數產生出有用的結果,同時也可以結合其他函數發揮出更大的威力. 單招學會了,就要學會連招 combo 了。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM