Mysql 分组编码

Mysql 分组编码,mysql,group-concat,Mysql,Group Concat,是否可以在组_CONCAT中进行编号 像 如果,从组_CONCATempnam分隔符',' 我有一套 < JohnM, DannyP, TiffnyK, KarlM > 我需要 < 1.JohnM, 2.DannyP, 3.TiffnyK, 4.KarlM > 我试着跟随,但没有得到想要的结果 SET @x:=0; SELECT GROUP_CONCAT(@x:=@x+1,' ', s.empnam SEPARAT

是否可以在组_CONCAT中进行编号

如果,从组_CONCATempnam分隔符','

我有一套

 < JohnM, DannyP, TiffnyK, KarlM >
我需要

 < 1.JohnM, 2.DannyP, 3.TiffnyK, 4.KarlM >  
我试着跟随,但没有得到想要的结果

    SET @x:=0;

    SELECT 

            GROUP_CONCAT(@x:=@x+1,' ', s.empnam SEPARATOR ',   ') AS emps,  @x:=0 
    < tables >
    < filters >
可以在查询级别执行此操作,还是必须在应用程序端执行此操作?

尝试以下操作:

SET @x:=0;

SELECT 
        GROUP_CONCAT(CONCAT(@x:=@x+1, '.', s.empnam) SEPARATOR ',   ') AS emps,  @x:=0 
< tables >
< filters >

几年后,我们应该放弃select语句中的变异变量,因为从MySQL 8开始,我们可以使用标准方式,使用窗口函数:

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

2016年原始答复 您可以在应用程序端执行此操作,但在MySQL 5.7中这是可能的。在下面的查询中,我假设您按某种方式对名称进行分组,例如我称之为dep的部门。这是为了说明每个新组的计数器从1开始

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;
看 或者

确保将表名放在from子句中,并使用要分组的实际字段。如果有多个字段要分组,则需要更改分配给@i的表达式。例如,可以连接定义组的值


通过使用两个字符的分隔符,您可以确保每个名称之间有一个空格。

我认为如果您在应用程序端执行此操作会更好。与我的查询结果相比,它不会在新记录上以1刷新!我是在申请时做的side@Hytool我认为这应该是可行的,请检查这里的演示,因为我的查询必须为单个记录执行大量分组操作,它在内部被搞得一团糟,无论如何,您的解决方案只需按查询分组就可以了,所以我的解决方案也可以了!谢谢你抽出时间!我知道这很古老,但你知道我为什么不能在你的小提琴上得到同样的结果?e、 g.这不是mysql版本,在这里可以很容易地检查,事实上,这是一个旧的问答。我不知道为什么在db fiddle上的结果不同:看起来变量是在不同的时刻计算的。无论如何,由于MySQL 8支持窗口函数,因此在查询中应该没有更多的理由使用变异变量。这个变量机制的行为是未定义的,不应该再使用。我已经更新了我的答案,包括MySQL 8解决方案。非常感谢MySQL 8解决方案,遗憾的是,我还希望支持旧版本。还是想办法得到我想要的结果。好吧,我玩了一点,出于某种原因,db fiddle后面的db引擎不喜欢变量没有初始化。因此,在from子句中添加一个初始化。我相应地更新了我的答案。