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

MySQL: รวมค่าซ้ำในคอลัมน์เป็นแถวเดียว คั่นด้วยอักขระพิเศษด้วย GROUP_CONCAT


คำอธิบาย

ใช้ GROUP_CONCAT() ร่วมกับ DISTINCT เพื่อรวมค่าที่ซ้ำกันในกลุ่มเดียวกัน ให้อยู่ในแถวเดียว คั่นด้วยตัวคั่นที่กำหนด (เช่น Hyphen -)

ขั้นตอนการสร้างตารางและข้อมูลตัวอย่าง

mysql> create table DemoTable ( 
    Id int, 
    Subject varchar(40) ); 
Query OK, 0 rows affected (0.56 sec)

การเพิ่มข้อมูล

mysql> insert into DemoTable values(100, 'MySQL'); 
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values(100, 'MongoDB'); 
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable values(100, 'Java'); 
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(100, 'MongoDB'); 
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values(101, 'MySQL'); 
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values(101, 'MySQL'); 
Query OK, 1 row affected (0.10 sec)

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

mysql> select * from DemoTable;

ผลลัพธ์:

+------+---------+
| Id   | Subject |
+------+---------+
| 100  | MySQL   |
| 100  | MongoDB |
| 100  | Java    |
| 100  | MongoDB |
| 101  | MySQL   |
| 101  | MySQL   |
+------+---------+
6 rows in set (0.00 sec)

คิวรี่รวมค่าที่ไม่ซ้ำ คั่นด้วย Hyphen

mysql> select Id, group_concat(distinct Subject separator '-') as Subject 
from DemoTable 
group by Id;

ผลลัพธ์

+------+--------------------+
| Id   | Subject            |
+------+--------------------+
| 100  | Java-MongoDB-MySQL |
| 101  | MySQL              |
+------+--------------------+
2 rows in set (0.04 sec)

คำอธิบาย

  • DISTINCT: ลบค่าซ้ำก่อนรวม (MongoDB ปรากฏ 2 ครั้ง แต่แสดงครั้งเดียว)
  • SEPARATOR '-': กำหนดตัวคั่น (Default คือ จุลภาค ,)
  • GROUP BY Id: จัดกลุ่มตาม Id

ตัวเลือกเพิ่มเติม

  • ORDER BY ภายใน GROUP_CONCAT: GROUP_CONCAT(DISTINCT Subject ORDER BY Subject SEPARATOR '-')
  • ควบคุมความยาวสูงสุดด้วย group_concat_max_len (Default 1024 ตัวอักษร)