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

MySQL: GROUP BY คอลัมน์เดียว แต่ SELECT ทุกคอลัมน์ด้วย GROUP_CONCAT

การ 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