Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

รวมผลลัพธ์ MySQL ให้แสดงในบรรทัดเดียวด้วย GROUP_CONCAT

GROUP_CONCAT(): รวมหลายแถวเป็นสตริงเดียว

ฟังก์ชัน GROUP_CONCAT() รวมค่าจากหลายแถวเป็นสตริงเดียว คั่นด้วย Separator ที่กำหนด ใช้ได้กับ GROUP BY หรือไม่ก็ได้ (จะรวมทั้ง Result Set)

สร้างตารางและข้อมูล

mysql> CREATE TABLE DemoTable1507 (
    -> Name VARCHAR(20),
    -> PaperSet INT
    -> );
Query OK, 0 rows affected (0.68 sec)

mysql> INSERT INTO DemoTable1507 VALUES
    -> ('Chris', 111), ('David', 112), ('Mike', 111), ('Bob', 113);
Query OK, 4 rows affected

ข้อมูลทั้งหมด

+-------+----------+
| Name  | PaperSet |
+-------+----------+
| Chris |      111 |
| David |      112 |
| Mike  |      111 |
| Bob   |      113 |
+-------+----------+

คำสั่ง: รวม Name ที่ PaperSet=111 เรียงจาก Z-A คั่นด้วย :

mysql> SELECT GROUP_CONCAT(Name ORDER BY Name DESC SEPARATOR ':')
    -> FROM DemoTable1507
    -> WHERE PaperSet = 111;

ผลลัพธ์

+-----------------------------------------------------+
| group_concat(Name order by Name desc separator ':') |
+-----------------------------------------------------+
| Mike:Chris                                          |
+-----------------------------------------------------+

ไวยากรณ์เต็ม

GROUP_CONCAT([DISTINCT] expr [ORDER BY ...] [SEPARATOR str])

ตัวเลือกที่ใช้บ่อย

⚠️ ข้อจำกัด: group_concat_max_len

ค่า Default = 1024 ตัวอักษร หากข้อมูลเยอะจะถูกตัดทิ้ง

-- ดูค่าปัจจุบัน
SHOW VARIABLES LIKE 'group_concat_max_len';

-- เพิ่มชั่วคราว (Session)
SET SESSION group_concat_max_len = 1000000;

-- เพิ่มถาวร (my.cnf / my.ini)
[mysqld]
group_concat_max_len = 1000000

กรณีใช้กับ GROUP BY

SELECT PaperSet, GROUP_CONCAT(Name ORDER BY Name) AS names
FROM DemoTable1507
GROUP BY PaperSet;

ผลลัพธ์

+----------+---------------+
| PaperSet | names         |
+----------+---------------+
|      111 | Chris,Mike    |
|      112 | David         |
|      113 | Bob           |
+----------+---------------+
ตัวเลือกคำอธิบายตัวอย่าง
DISTINCTลบค่าซ้ำGROUP_CONCAT(DISTINCT Name)
ORDER BYเรียงลำดับก่อนรวมGROUP_CONCAT(Name ORDER BY Name)
SEPARATORตัวคั่น (Default = ',')GROUP_CONCAT(Name SEPARATOR ';')