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