【问题标题】:GROUP_CONCAT numberingGROUP_CONCAT 编号
【发布时间】:2016-07-19 05:08:47
【问题描述】:

是否可以在 GROUP_CONCAT 中进行编号

喜欢

如果,从 GROUP_CONCAT(empnam SEPARATOR ', ')

我有一套,

 < 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 >

是否可以在查询级别进行,或者我必须在应用程序端进行?

【问题讨论】:

  • 我觉得在应用端做会更好

标签: mysql group-concat


【解决方案1】:

多年后,我们应该在 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

db-fiddle

原始答案(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;

SQL fiddledb-fiddle

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

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

【讨论】:

  • 我知道这已经很老了,但你知道为什么我在你的小提琴中没有得到相同的结果吗?例如db-fiddle.com/f/x4diVXc2WNeycuv3CShPpB/0不是mysql版本,可以在这里轻松查看dbfiddle.uk/…
  • 确实,老Q&A。我不知道为什么 db-fiddle 的结果不同:看起来变量是在不同的时刻评估的。无论如何,从 MySQL 8 开始,它的窗口函数支持,应该没有更多的理由在查询中使用变异变量。此变量机制的行为未定义,不应再使用。
  • 我已经更新了我的答案,包括 MySQL 8 的方法。
  • 非常感谢 mysql 8 解决方案,遗憾的是我也支持旧版本。仍然想办法得到我想要的结果。
  • 好吧,我玩了一下,出于某种原因,db-fiddle 后面的数据库引擎不喜欢变量没有被初始化。所以在from 子句中添加一个初始化。我相应地更新了我的答案。
【解决方案2】:

试试这个:

SET @x:=0;

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

【讨论】:

  • 与我的查询结果并没有真正的区别,无论如何它不会在新记录的 1 处刷新!我是在应用程序端完成的
  • @Hytool 我认为这应该可以,请在此处查看演示sqlfiddle.com/#!9/4b523/3
  • 由于我的查询必须为单个记录执行大量 GROUP BY,因此内部混乱,无论如何,您的解决方案仅适用于按查询分组,因此我的解决方案也适用!谢谢你的时间!
猜你喜欢
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 2013-05-26
  • 2020-05-05
  • 2018-09-21
相关资源
最近更新 更多