Nhiều năm sau, chúng ta nên loại bỏ các biến đột biến bên trong select
, vì kể từ MySQL 8, chúng ta có thể sử dụng theo cách tiêu chuẩn, với các hàm cửa sổ:
with base as (
select dep,
empnam,
count(*) over (partition by dep order by empnam) num
from t)
select dep,
group_concat(concat(num, '.', empnam) separator ', ') emps
from base
group by dep
Xem db-fiddle
Câu trả lời gốc (2016)
Bạn có thể làm điều này ở phía ứng dụng, nhưng trong MySQL 5.7 thì hoàn toàn có thể. Trong truy vấn sau, tôi giả sử bạn nhóm các tên theo thứ gì đó, chẳng hạn như bộ phận của họ (tôi gọi nó là dep ). Điều này để minh họa rằng bộ đếm bắt đầu từ 1 cho mọi nhóm mới.
select dep,
group_concat(
concat(@i := if (@grp = dep, @i + 1, if(@grp := dep,1,1)), '.', empnam)
separator ', ') emps
from t,
(select @i := 0, @grp := '') init
group by dep;
Xem SQL fiddle hoặc db-fiddle .
Đảm bảo đặt tên bảng của bạn trong from
và để sử dụng trường thực tế mà bạn muốn nhóm theo. Nếu bạn có nhiều trường để nhóm theo, biểu thức được chỉ định cho @i sẽ cần phải thay đổi. Ví dụ, bạn có thể nối các giá trị xác định một nhóm.
Bằng cách sử dụng dấu phân tách hai ký tự, bạn đảm bảo có khoảng cách giữa mỗi tên.