Chuẩn bị bảng và dữ liệu
mysql> CREATE TABLE DemoTable1627 (
-> FirstName VARCHAR(20),
-> LastName VARCHAR(20)
-> );
Query OK, 0 rows affected (0.59 sec)
mysql> INSERT INTO DemoTable1627 VALUES('John','Smith');
mysql> INSERT INTO DemoTable1627 VALUES('John','Doe');
mysql> INSERT INTO DemoTable1627 VALUES('Adam','Smith');
mysql> INSERT INTO DemoTable1627 VALUES('Carol','Taylor');
Dữ liệu gốc
mysql> SELECT * FROM DemoTable1627;
+-----------+----------+
| FirstName | LastName |
+-----------+----------+
| John | Smith |
| John | Doe |
| Adam | Smith |
| Carol | Taylor |
+-----------+----------+
Truy vấn GROUP_CONCAT với đánh số theo nhóm
Sử dụng biến người dùng (@j, @p) để đếm thứ tự trong mỗi nhóm LastName:
mysql> SELECT
-> LastName,
-> GROUP_CONCAT(
-> CONCAT(@j := IF(@p = LastName, @j + 1, IF(@p := LastName, 1, 1)), '.', FirstName)
-> SEPARATOR ', '
-> ) AS FirstName
-> FROM DemoTable1627
-> GROUP BY LastName;
Kết quả
+----------+----------------+
| LastName | FirstName |
+----------+----------------+
| Doe | 1.John |
| Smith | 1.John, 2.Adam |
| Taylor | 1.Carol |
+----------+----------+
3 rows in set (0.09 sec)
Lưu ý: Kỹ thuật này dùng biến session để mô phỏng ROW_NUMBER() trước khi MySQL 8.0 hỗ trợ window function.