1. Cách sử dụng cơ bản của hàm MySQL GROUP_CONCAT()
GROUP_CONCAT() là một hàm tổng hợp của MySQL, nó nối các giá trị từ nhiều hàng lại thành một chuỗi duy nhất. Điều này cho phép bạn kết hợp nhiều dữ liệu thành một trường. Nó đặc biệt hữu ích khi bạn muốn hiển thị kết quả tổng hợp hoặc tóm tắt một cách hiệu quả.
Cú pháp cơ bản
Cú pháp cơ bản của GROUP_CONCAT() như sau:
SELECT GROUP_CONCAT(column_name) FROM table_name GROUP BY column_name;
Hàm này thường được sử dụng cùng với mệnh đề GROUP BY. Ví dụ, truy vấn sau liệt kê tên nhân viên được nhóm theo phòng ban:
SELECT department, GROUP_CONCAT(employee_name) FROM employees GROUP BY department;
Kết quả trả về là tên nhân viên thuộc mỗi phòng ban dưới dạng chuỗi phân tách bằng dấu phẩy.
2. Các tùy chọn tùy chỉnh cho GROUP_CONCAT()
Hàm GROUP_CONCAT() không chỉ đơn giản là kết hợp các giá trị—nó còn cung cấp nhiều tùy chọn tùy chỉnh. Bạn có thể thay đổi ký tự phân tách, loại bỏ các giá trị trùng lặp và chỉ định thứ tự sắp xếp cho các trường hợp sử dụng nâng cao.
2.1 Thay đổi ký tự phân tách
Mặc định, GROUP_CONCAT() phân tách các giá trị bằng dấu phẩy. Tuy nhiên, bạn có thể thay đổi ký tự phân tách bằng từ khóa SEPARATOR. Ví dụ, để phân tách tên nhân viên bằng dấu chấm phẩy:
SELECT department, GROUP_CONCAT(employee_name SEPARATOR '; ') AS employees
FROM employees
GROUP BY department;
Truy vấn này xuất ra tên nhân viên được phân tách bằng dấu chấm phẩy.
2.2 Loại bỏ các giá trị trùng lặp
Mặc định, GROUP_CONCAT() bao gồm tất cả các giá trị trùng lặp. Tuy nhiên, bạn có thể loại bỏ các giá trị trùng lặp bằng từ khóa DISTINCT. Dưới đây là một truy vấn ví dụ loại bỏ các tên nhân viên trùng lặp:
SELECT department, GROUP_CONCAT(DISTINCT employee_name) AS employees
FROM employees
GROUP BY department;
2.3 Sắp xếp kết quả
Bạn có thể kiểm soát thứ tự của các phần tử được nối trong GROUP_CONCAT(). Bằng cách sử dụng mệnh đề ORDER BY, bạn có thể sắp xếp các giá trị theo thứ tự tăng dần hoặc giảm dần. Ví dụ sau sắp xếp tên nhân viên theo thứ tự bảng chữ cái:
SELECT department, GROUP_CONCAT(employee_name ORDER BY employee_name ASC) AS employees
FROM employees
GROUP BY department;
Truy vấn này nối các tên nhân viên theo thứ tự bảng chữ cái. Để sắp xếp giảm dần, sử dụng DESC.
3. Các trường hợp sử dụng nâng cao của GROUP_CONCAT()
3.1 Tạo danh sách sản phẩm theo danh mục
Bạn có thể sử dụng GROUP_CONCAT() để tạo danh sách tên sản phẩm cho mỗi danh mục. Ví dụ, truy vấn sau lấy tên sản phẩm được sắp xếp theo thứ tự bảng chữ cái trong mỗi danh mục:
SELECT category, GROUP_CONCAT(product_name ORDER BY product_name ASC) AS product_list
FROM products
GROUP BY category;
Kết quả sẽ được hiển thị như sau:
category product_list
Electronics Laptop, Phone, TV
Furniture Sofa, Table

3.2 Nối nhiều cột
Khi kết hợp nhiều cột bằng GROUP_CONCAT(), bạn có thể nối các cột lại với nhau bằng một ký tự phân tách tùy chỉnh. Trong ví dụ sau, ID sản phẩm và tên sản phẩm được nối bằng dấu hai chấm và kết hợp thành một chuỗi duy nhất:
SELECT category, GROUP_CONCAT(CONCAT(product_id, ':', product_name) ORDER BY product_name) AS product_info
FROM products
GROUP BY category;
Truy vấn này trả về ID sản phẩm và tên sản phẩm được kết hợp lại cho mỗi danh mục.
4. Giới hạn và tối ưu hiệu năng của GROUP_CONCAT()
Khi sử dụng GROUP_CONCAT(), có giới hạn độ dài đầu ra mặc định là 1024 ký tự. Ngoài ra, khi xử lý các bộ dữ liệu lớn, các yếu tố về hiệu năng trở nên quan trọng.
4.1 Thay đổi độ dài chuỗi tối đa
Nếu độ dài tối đa mặc định không đủ, bạn có thể thay đổi thiết lập phiên để tăng độ dài kết quả cho phép. Truy vấn sau đặt độ dài tối đa của phiên là 10.000 byte:
SET SESSION group_concat_max_len = 10000;
.Với cấu hình này, bạn có thể truy xuất kết quả một cách chính xác ngay cả với các bộ dữ liệu lớn.
4.2 Tối ưu hoá hiệu năng
Khi làm việc với lượng dữ liệu lớn, hiệu năng của GROUP_CONCAT() có thể trở thành vấn đề. Đặc biệt, việc thường xuyên sử dụng DISTINCT và ORDER BY có thể làm tăng thời gian xử lý. Để tối ưu hoá hiệu năng, hãy xem xét các điểm sau:
- Sử dụng chỉ mục: Thêm chỉ mục vào các cột được sử dụng trong mệnh đề
GROUP BYcó thể cải thiện đáng kể hiệu suất truy vấn. - Đặt độ dài tối đa phù hợp: Điều chỉnh
group_concat_max_lenkhi cần để tránh tạo ra các tập kết quả quá lớn một cách không cần thiết.
5. So sánh với các hàm tổng hợp khác
GROUP_CONCAT() khác với các hàm tổng hợp khác (như COUNT() và SUM()) vì nó nối dữ liệu thành một chuỗi duy nhất. Trong phần này, chúng tôi giải thích sự khác biệt giữa GROUP_CONCAT() và COUNT().
5.1 Sự khác biệt so với COUNT()
COUNT() là một hàm dùng để đếm số hàng thỏa mãn một điều kiện cụ thể. Trong khi GROUP_CONCAT() nối và xuất các chuỗi, COUNT() trả về một giá trị số. Ví dụ, truy vấn sau đếm số lượng nhân viên trong mỗi phòng ban:
SELECT department, COUNT(employee_id) AS employee_count
FROM employees
GROUP BY department;
Điều này cho phép bạn đếm số nhân viên thuộc mỗi phòng ban.
6. Kết luận
GROUP_CONCAT() là một trong những hàm tổng hợp linh hoạt nhất trong MySQL. Vì nó kết hợp dữ liệu thành một chuỗi duy nhất và cho phép tùy chỉnh cũng như sử dụng nâng cao, nên nó rất hiệu quả cho việc trực quan hoá cơ sở dữ liệu và tạo báo cáo. Tuy nhiên, bạn nên lưu ý các giới hạn độ dài ký tự và các ảnh hưởng tiềm năng đến hiệu năng, và cấu hình các thiết lập phù hợp khi cần thiết. Bằng cách kết hợp nó với các hàm tổng hợp khác, bạn có thể đạt được khả năng thao tác dữ liệu mạnh mẽ hơn nữa.


