Giới thiệu
Kết hợp GROUP BY và CONCAT() để gộp FirstName và LastName thành tên đầy đủ, đồng thời loại bỏ các bản ghi trùng lặp.
Ví dụ minh họa
Tạo bảng, thêm index và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
FirstName VARCHAR(100),
LastName VARCHAR(100)
);
mysql> ALTER TABLE DemoTable ADD INDEX (FirstName, LastName);
mysql> INSERT INTO DemoTable VALUES
('Adam', 'Smith'), ('Adam', 'Smith'), ('John', 'Doe'),
('Carol', 'Taylor'), ('John', 'Doe');
Xem dữ liệu (có trùng lặp)
mysql> SELECT * FROM DemoTable;
+-----------+----------+ | FirstName | LastName | +-----------+----------+ | Adam | Smith | | Adam | Smith | | Carol | Taylor | | John | Doe | | John | Doe | +-----------+----------+
Truy vấn gộp tên và loại trùng
mysql> SELECT CONCAT(FirstName, ' ', LastName) AS combinedName FROM DemoTable GROUP BY LastName, FirstName;
Kết quả
+--------------+ | combinedName | +--------------+ | Adam Smith | | Carol Taylor | | John Doe | +--------------+
Giải thích
GROUP BY LastName, FirstName: Nhóm theo cặp (LastName, FirstName), mỗi cặp chỉ xuất hiện 1 lần.CONCAT(FirstName, ' ', LastName): Nối chuỗi với dấu cách giữa.- Thứ tự GROUP BY không ảnh hưởng kết quả nhưng ảnh hưởng thứ tự hiển thị (nếu không có ORDER BY).
Lưu ý về ONLY_FULL_GROUP_BY
Nếu bật mode ONLY_FULL_GROUP_BY (mặc định từ MySQL 5.7), mọi cột trong SELECT phải nằm trong GROUP BY hoặc trong hàm tổng hợp. Truy vấn trên hợp lệ vì chỉ chọn cột đã GROUP BY.
Mở rộng: DISTINCT thay cho GROUP BY
SELECT DISTINCT CONCAT(FirstName, ' ', LastName) AS combinedName FROM DemoTable ORDER BY combinedName;
Cách này đơn giản hơn nếu chỉ cần loại trùng kết quả cuối cùng.