#### mysql用group_concat()合并關聯表的多行信息到一個行字段
* * * * *
假設有兩張表,分別為訂單a,明細表b,訂單與明細為一對多的關系。
明細表通過外鍵id-與a表關聯。假設b表中存在字段name,現需要查詢訂單a表中的記錄,同時獲取存儲在訂單明細表b中的貨品名稱的信息(name字段),按照常規的查詢統計,明細表中有多少記錄,就會顯示多少行,如果我們只需要顯示訂單表a記錄及明細表當中貨品名稱的信息,則需要把查詢明細表name字段得到的多個明細記錄進行合并,這可以直接通過sql語句完成。
##### 方法:
利用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;
~~~
#### GROUP_CONCAT語法與實例代碼
本文為大家講解的是mysql數據庫中的`GROUP_CONCAT()`函數使用方法,感興趣的同學參考下.
語法:
~~~
GROUP_CONCAT(
[ DISTINCT ] expr [, expr...][
ORDER BY
{ unsigned_integer | col_name | expr }[ ASC | DESC ] [, col_name...]][ SEPARATOR str_val ]
)
~~~
下面演示一下函數,先建立一個學生選課表student_courses,并填充測試數據。
~~~
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:
~~~
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條記錄,如下所示:
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語句就顯得非常簡單了,如下所示:
~~~
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處理就簡單了:
~~~
$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來指定,例如:
~~~
SELECT
student_id,
GROUP_CONCAT(courses_id SEPARATOR '|||') AS courses
FROM
student_courses
WHERE
student_id = 2
GROUP BY
student_id;
~~~
還可以對這個組的值先進行排序再連接成字符串,例如,按courses_id降序來排:
~~~
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;
~~~
* * * * *
https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat
- 目錄
- 數據庫表
- 13.7.5.6 SHOW COLUMNS Syntax
- Mysql生成列
- 表注釋
- 默認字符集
- 索引
- 外鍵約束
- 數據類型
- NULL
- 查詢語句
- IF
- CASE
- FIND_IN_SET
- 更新語句
- 復制更新
- 截取更新
- 插入語句
- 從一張表查詢一個字段值插入另一個表中
- 統計函數
- COUNT
- 分組統計
- 日期時間字段按照日期分組
- GROUP_CONCAT
- 多字段關聯
- LENGTH
- mb_strlen()
- SUM
- 按周,按月,按日分組統計數據
- 日期時間
- MySQL日期時間數據類型使用總結
- 計算日期差
- 插入當前日期時間
- 時間比較
- datetime
- 日期時間取時間段
- 統計
- 整型unix時間戳
- 計算兩條相鄰記錄的時間差
- 日期時間-函數
- 常用函數
- CURDATE
- DATEDIFF
- DATE_ADD
- DATE_SUB
- EXTRACT
- NOW
- TO_DAYS
- UNIX_TIMESTAMP
- 作為時間比較
- FROM_UNIXTIME
- DATE_FORMAT
- TIMESTAMPDIFF
- 觸發器
- 存儲過程
- MySQL存儲過程的基本函數
- 分頁存儲過程
- 存儲過程教程
- 臨時表
- 備份表
- CRM
- 客戶關系表
- 通訊錄
- SQL函數
- ISNULL
- IFNULL
- SUBSTR
- 模糊查詢
- JSON
- Json函數
- Json數據類型
- 使用Json
- 使用navicat
- 虛擬列
- CRUD
- 索引設計
- 增加多字段索引
- 共享排他鎖