การ GROUP BY คอลัมน์เดียว แต่อยากได้ข้อมูลคอลัมน์อื่นทั้งหมด
ปกติ GROUP BY ต้องการให้คอลัมน์ใน SELECT อยู่ใน GROUP BY หรืออยู่ในฟังก์ชันรวม หากต้องการรวมแถวตามคอลัมน์หนึ่ง แต่เก็บค่าคอลัมน์อื่นทั้งหมดไว้ ใช้ GROUP_CONCAT() รวมค่าเป็นสตริงคั่นด้วยคอมมา
ตัวอย่างการใช้งาน
สร้างตารางและเพิ่มข้อมูล:
mysql> CREATE TABLE groupByOneSelectAll (
-> StudentDetails VARCHAR(100),
-> StudentName VARCHAR(100)
-> );
Query OK, 0 rows affected (0.91 sec)
mysql> INSERT INTO groupByOneSelectAll VALUES('StudentFirstName', 'John');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO groupByOneSelectAll VALUES('StudentFirstName', 'Chris');
Query OK, 1 row affected (0.21 sec)
mysql> INSERT INTO groupByOneSelectAll VALUES('StudentFirstName', 'Robert');
Query OK, 1 row affected (0.65 sec)
mysql> INSERT INTO groupByOneSelectAll VALUES('StudentFirstName', 'Bob');
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO groupByOneSelectAll VALUES('StudentFirstName', 'David');
Query OK, 1 row affected (0.15 sec)
ข้อมูลทั้งหมด:
mysql> SELECT * FROM groupByOneSelectAll;
+------------------+-------------+
| StudentDetails | StudentName |
+------------------+-------------+
| StudentFirstName | John |
| StudentFirstName | Chris |
| StudentFirstName | Robert |
| StudentFirstName | Bob |
| StudentFirstName | David |
+------------------+-------------+
5 rows in set (0.00 sec)
GROUP BY StudentDetails รวมชื่อด้วย GROUP_CONCAT:
mysql> SELECT StudentDetails, GROUP_CONCAT(StudentName)
-> FROM groupByOneSelectAll
-> GROUP BY StudentDetails;
+------------------+-----------------------------+
| StudentDetails | GROUP_CONCAT(StudentName) |
+------------------+-----------------------------+
| StudentFirstName | John,Chris,Robert,Bob,David |
+------------------+-----------------------------+
1 row in set (0.05 sec)
คำอธิบายและตัวเลือก GROUP_CONCAT
- Default Separator = คอมมา (,) ใช้
SEPARATOR '|'เปลี่ยนได้ GROUP_CONCAT(DISTINCT StudentName)ลบชื่อซ้ำก่อนรวมGROUP_CONCAT(StudentName ORDER BY StudentName)เรียงก่อนรวม- รวมได้:
GROUP_CONCAT(DISTINCT StudentName ORDER BY StudentName SEPARATOR '; ')
ข้อจำกัด
ความยาวสูงสุดของผลลัพธ์ควบคุมโดยตัวแปร group_concat_max_len (Default 1024 bytes) หากข้อมูลเยอะอาจถูกตัด ให้เพิ่มค่า: SET SESSION group_concat_max_len = 1000000;
ทางเลือก MySQL 8.0+: JSON_ARRAYAGG
SELECT StudentDetails, JSON_ARRAYAGG(StudentName) AS names_json
FROM groupByOneSelectAll
GROUP BY StudentDetails;
คืนค่า JSON Array ง่ายต่อการประมวลผลใน Application