Des années plus tard, nous devrions abandonner les variables mutantes à l'intérieur d'un select
déclaration, comme depuis MySQL 8, nous pouvons utiliser la méthode standard, avec les fonctions de fenêtre :
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
Voir db-fiddle
Réponse originale (2016)
Vous pouvez le faire du côté de l'application, mais dans MySQL 5.7, c'est possible. Dans la requête suivante, je suppose que vous regroupez les noms par quelque chose, par exemple leur département (je l'ai appelé dep ). Ceci afin d'illustrer que le compteur commence à partir de 1 pour chaque nouveau groupe.
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;
Voir violon SQL ou db-fiddle .
Assurez-vous de mettre le nom de votre table dans le from
clause et d'utiliser le champ réel par lequel vous souhaitez effectuer le regroupement. Si vous avez plusieurs champs à regrouper, l'expression attribuée à @i devra changer. Vous pouvez par exemple concaténer les valeurs qui définissent un groupe.
En utilisant un séparateur de deux caractères vous vous assurez d'avoir un espace entre chaque nom.