本文通過實例介紹了MySQL中的group_concat函數的使用方法,比如select group_concat(name) 。
MySQL中group_concat函數
完整的語法如下:
group_concat([DISTINCT] 要連接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])
基本查詢
mysql> select * from aa;
+------+------+
| id| name |
+------+------+
|1 | 10|
|1 | 20|
|1 | 20|
|2 | 20|
|3 | 200 |
|3 | 500 |
+------+------+
6 rows in set (0.00 sec)
以id分組,把name字段的值打印在一行,逗號分隔(默認)
mysql> select id,group_concat(name) from aa group by id;
+------+--------------------+
| id| group_concat(name) |
+------+--------------------+
|1 | 10,20,20|
|2 | 20 |
|3 | 200,500|
+------+--------------------+
3 rows in set (0.00 sec)
以id分組,把name字段的值打印在一行,分號分隔
mysql> select id,group_concat(name separator ';') from aa group by id;
+------+----------------------------------+
| id| group_concat(name separator ';') |
+------+----------------------------------+
|1 | 10;20;20 |
|2 | 20|
|3 | 200;500 |
+------+----------------------------------+
3 rows in set (0.00 sec)
以id分組,把去冗余的name字段的值打印在一行,
逗號分隔
mysql> select id,group_concat(distinct name) from aa group by id;
+------+-----------------------------+
| id| group_concat(distinct name) |
+------+-----------------------------+
|1 | 10,20|
|2 | 20 |
|3 | 200,500 |
+------+-----------------------------+
3 rows in set (0.00 sec)
以id分組,把name字段的值打印在一行,逗號分隔,以name排倒序
mysql> select id,group_concat(name order by name desc) from aa group by id;
+------+---------------------------------------+
| id| group_concat(name order by name desc) |
+------+---------------------------------------+
|1 | 20,20,10 |
|2 | 20|
|3 | 500,200|
+------+---------------------------------------+
3 rows in set (0.00 sec)
有長度限制的,長度設置 請看 group_concat的長度設置鏈接。
簡單用法:
SET GLOBAL group_concat_max_len=102400;后直接跟包含group_concat 的sql語句即可。(全局 查詢 的設置,只要設置,這個mysql服務器 下 這兒長度就永久設置成這個值。 )
SET SESSION group_concat_max_len=102400;后直接跟包含group_concat 的sql語句即可。(一次session查詢 的設置,只會在同一個session 下的查詢才會生效 )
注:以上舉例都是將分完組后每組里數據 合並到一行,即結果記錄還是根據有幾個組 ,結果記錄 就有幾條記錄。 那怎么樣 才能 把 分完組后的幾條記錄 也最終合並到一行呢?
解決思路,可以將分完組后的記錄 再次作為臨時表,然后附加一個相同值的字段,然后再重新分組合並即可。如下:
將歷練中低級、中級、高級 三個類型下的最高npc 的id 合並 到一行,這怎么做呢,根據上表說明,解決腳本如下:
@SELECT MAX(n_id) AS nid,n_type FROM dict_dream_template GROUP BY n_type; 結果
nid n_type ------- -------- 1500008 1 2500008 2 3010049 3
可以看出結果記錄中 類型有3個組,而且每組 最大的npc 的id 也查出來了。那現在怎么樣才能把 這三個組的最大npc 的id 合並到一組,很簡單,把這個結果記錄當成一個表重新附加個相同字段:
@SELECT MAX(n_id) AS nid,n_type,1 AS addsame FROM dict_dream_template GROUP BY n_type;
nid n_type addsame ------- ------ --------- 1500008 1 1 2500008 2 1 3010049 3 1
可以看出上邊給查詢結果已經附加了一個值皆為1的 addsame 零時別名字段,那下邊把這個結果當成一個表,給表起個別名 就可以重新 按照 addsame分組 查詢 然后合並了
@SELECT GROUP_CONCAT(nid),GROUP_CONCAT(n_type) FROM (SELECT MAX(n_id) AS nid,n_type,1 AS addsame FROM dict_dream_template GROUP BY n_type) t GROUP BY addsame;
group_concat(nid) GROUP_CONCAT(n_type) addsame ----------------------- -------------------- --------- 1500008,2500008,3010049 1,2,3 1
可以看出 上邊已經 將上一步查詢結果 合並好了,這個結果就是我最終要的數據,即 將分過組后的每組記錄給合並 到一行,即最終結果記錄里就一行數據。