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

การต่อหลายแถวและหลายคอลัมน์เป็นแถวเดียวใน MySQL ด้วย GROUP_CONCAT

เมื่อต้องการรวมข้อมูลจากหลายแถวและหลายคอลัมน์ให้กลายเป็นสตริงเดียวใน 1 แถว ใช้ GROUP_CONCAT() ร่วมกับ CONCAT() ซึ่งเป็นเทคนิค Pivot/String Aggregation ที่นิยมใน MySQL

ตัวอย่างการใช้งาน

สร้างตารางลูกค้า:

mysql> CREATE TABLE DemoTable1463 (
    -> ClientId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> ClientName VARCHAR(20),
    -> ClientAge INT
    -> );

เพิ่มข้อมูล (มี NULL ใน Age):

mysql> INSERT INTO DemoTable1463 (ClientName, ClientAge) VALUES ('Adam Smith', 34);
mysql> INSERT INTO DemoTable1463 (ClientName, ClientAge) VALUES ('John Doe', 29);
mysql> INSERT INTO DemoTable1463 (ClientName, ClientAge) VALUES ('David Miller', NULL);
mysql> INSERT INTO DemoTable1463 (ClientName, ClientAge) VALUES ('John Smith', 32);

ดูข้อมูล:

mysql> SELECT * FROM DemoTable1463;
+----------+--------------+-----------+
| ClientId | ClientName   | ClientAge |
+----------+--------------+-----------+
|        1 | Adam Smith   |        34 |
|        2 | John Doe     |        29 |
|        3 | David Miller |      NULL |
|        4 | John Smith   |        32 |
+----------+--------------+-----------+

ต่อคอลัมน์ Id:Name:Age ทุกแถว คั่นด้วย Comma:

mysql> SELECT GROUP_CONCAT(CONCAT(ClientId, ':', ClientName, ':', IFNULL(ClientAge, '')))
    -> FROM DemoTable1463;

ผลลัพธ์ (1 แถว 1 คอลัมน์):

+------------------------------------------------------------------------+
| GROUP_CONCAT(CONCAT(ClientId, ':', ClientName, ':', IFNULL(ClientAge, ''))) |
+------------------------------------------------------------------------+
| 1:Adam Smith:34,2:John Doe:29,3:David Miller:,4:John Smith:32          |
+------------------------------------------------------------------------+

ฟังก์ชันที่ใช้

ตัวเลือก GROUP_CONCAT

GROUP_CONCAT(expr [ORDER BY ...] [SEPARATOR 'str'] [LIMIT n])
  • ORDER BY: เรียงลำดับก่อนต่อ (เช่น ORDER BY ClientId)
  • SEPARATOR: เปลี่ยนตัวคั่น (Default = ',')
  • LIMIT: จำกัดจำนวนแถวที่ต่อ

ตัวอย่าง進階

-- คั่นด้วย Semicolon เรียงตามชื่อ
SELECT GROUP_CONCAT(CONCAT(ClientName, '(', ClientAge, ')') ORDER BY ClientName SEPARATOR '; ')
FROM DemoTable1463;
-- ผลลัพธ์: Adam Smith(34); David Miller(); John Doe(29); John Smith(32)

-- จำกัด 2 แถวแรก
SELECT GROUP_CONCAT(ClientName ORDER BY ClientId LIMIT 2) FROM DemoTable1463;
-- ผลลัพธ์: Adam Smith,John Doe

ข้อจำกัด

  • group_concat_max_len: ความยาวสูงสุด Default 1024 ตัวอักษร (เพิ่มได้ด้วย SET SESSION group_concat_max_len = 1000000)
  • NULL ใน CONCAT จะทำให้ทั้งสตริงเป็น NULL → ต้องใช้ IFNULL/COALESCE
  • ไม่รองรับ DISTINCT ภายใน GROUP_CONCAT โดยตรง (ใช้ GROUP_CONCAT(DISTINCT ...) ได้)
ฟังก์ชันบทบาท
CONCAT(str1, str2, ...)ต่อคอลัมน์ในแต่ละแถว (Id:Name:Age)
IFNULL(expr, '')แปลง NULL เป็น Empty String ป้องกัน CONCAT คืน NULL
GROUP_CONCAT(expr)รวมสตริงจากทุกแถว คั่นด้วย Comma (Default)