萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> MySQL中group_concat函數使用例子

MySQL中group_concat函數使用例子

group_concat函數我們使用的不多但是group_concat函數是非常的有用了今天小編來為各位介紹一下關於mysql中group_concat函數的用法吧。


本文通過實例介紹了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)

下面演示一下這個函數,先建立一個學生選課表student_courses,並填充一些測試數據。

SQL代碼


CREATE TABLE student_courses (     
    student_id INT UNSIGNED NOT NULL,     
    courses_id INT UNSIGNED NOT NULL,     
    KEY(student_id)     
);     
INSERT INTO student_courses VALUES (1, 1), (1, 2), (2, 3), (2, 4), (2, 5);   


若要查找學生ID為2所選的課程,則使用下面這條SQL:

SQL代碼


mysql> SELECT student_id, courses_id FROM student_courses WHERE student_id=2;     
+------------+------------+     
| student_id | courses_id |     
+------------+------------+     
|          2 |          3 |     
|          2 |          4 |     
|          2 |          5 |     
+------------+------------+     
3 rows IN SET (0.00 sec) 
 

輸出結果有3條記錄,說明學生ID為2的學生選了3、4、5這3門課程。
放在PHP裡,必須用一個循環才能取到這3條記錄,如下所示:

 

PHP代碼


foreach ($pdo->query("SELECT student_id, courses_id FROM student_courses WHERE student_id=2") as $row) {     
    $result[] = $row['courses_id'];     
}    

而如果采用GROUP_CONCAT()函數和GROUP BY語句就顯得非常簡單了,如下所示:

 

SQL代碼


mysql> SELECT student_id, GROUP_CONCAT(courses_id) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id;     
+------------+---------+     
| student_id | courses |     
+------------+---------+     
|          2 | 3,4,5   |     
+------------+---------+     
1 row IN SET (0.00 sec)  


這樣php裡處理就簡單了:

 

PHP代碼


$row = $pdo->query("SELECT student_id, GROUP_CONCAT(courses_id) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id");     
$result = explode(',', $row['courses']);    


分隔符還可以自定義,默認是以“,”作為分隔符,若要改為“|||”,則使用SEPARATOR來指定,例如:

 

SQL代碼


SELECT student_id, GROUP_CONCAT(courses_id SEPARATOR '|||') AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id;    

除此之外,還可以對這個組的值來進行排序再連接成字符串,例如按courses_id降序來排:

SQL代碼


SELECT student_id, GROUP_CONCAT(courses_id ORDER BY courses_id DESC) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id;

group_concat()合並多行數據到一行

利用group_concat()方法,參數為需要合並的字段,合並的字段分隔符默認為逗號,可通過參數separator指定,該方法往往配合group by 一起使用。
例子:

select a.*,group_concat(b.name separator '-') as name from a left join b on a.id=b.id group by a.id;

copyright © 萬盛學電腦網 all rights reserved