MySQL GROUP_CONCAT分配递增值

时间:2013-07-19 09:05:32

标签: mysql group-concat

我需要为结果中每一行开始的连续行中的每个字符串分配一个递增值。

这是一个简化的数据样本:

number|color
1     |red
1     |blue
1     |orange
2     |brown
3     |purple
3     |yellow

这是我需要的结果:

number|color_set
1     |0 red,1 blue,2 orange
2     |0 brown
3     |0 purple,1 yellow

这是我得到的结果:

number|color_set
1     |0 red,1 blue,2 orange
2     |3 brown
3     |4 purple,5 yellow

这就是我一直在尝试的:

SET @x:=0;

SELECT number, GROUP_CONCAT(@x:=@x+1,' ',color SEPARATOR ',')
FROM table
GROUP BY number;

每个结果行需要将变量重置为0。我显然不是专家,而且我是网站的新手所以非常感谢任何帮助。

谢谢,

4 个答案:

答案 0 :(得分:3)

我知道这已经得到了解答,但这不是一个更简单的方法吗?只需将@x:= 0添加到选择?

SET @x:= 0;

SELECT号码,GROUP_CONCAT(@x:= @ x + 1,'',颜色分离器','),@ x:= 0 从表 GROUP BY号码;

答案 1 :(得分:1)

只是为了好玩......

 CREATE TABLE colors(color_set INT NOT NULL,color VARCHAR(12) NOT NULL,PRIMARY KEY (color_set,color));

 INSERT INTO colors VALUES
 (1     ,'red'),
 (1     ,'blue'),
 (1     ,'orange'),
 (2     ,'brown'),
 (3     ,'purple'),
 (3     ,'yellow');


      SELECT color_set
      , GROUP_CONCAT(CONCAT_WS(' ',n,color) ORDER BY n) array
   FROM
      ( SELECT c.*
             , FIND_IN_SET(color,x)-1 n 
          FROM colors c
          JOIN 
             ( SELECT color_set
                    , GROUP_CONCAT(color ORDER BY LENGTH(color),color) x 
                 FROM colors 
                GROUP 
                   BY color_set
             ) y
            ON y.color_set = c.color_set
      ) z
  GROUP 
     BY color_set;

 +-----------+-----------------------+
 | color_set | array                 |
 +-----------+-----------------------+
 |         1 | 0 red,1 blue,2 orange |
 |         2 | 0 brown               |
 |         3 | 0 purple,1 yellow     |
 +-----------+-----------------------+

答案 2 :(得分:0)

两步解决方案怎么样?或者它必须只是1个SQL查询?

  1. 使用(id,color)创建临时表,将id声明为自动增量,将自动增量的开始设置为0(ALTER TABLE tbl AUTO_INCREMENT = 0;
  2. 选择并插入要转换的记录(INSERT INTO ttTable SELECT color FROM datatable WHERE number = 3),然后将其读回并通过GROUP_CONCAT生成列表。您必须对原始表中的所有数字重复此步骤。

答案 3 :(得分:0)

也只是为了好玩......

SELECT
number,
GROUP_CONCAT(CONCAT(counter, ' ', color)) 
FROM (
SELECT
number,
color,
@counter := CASE WHEN @prev = number THEN @counter + 1 ELSE 0 END AS counter,
@prev := number
FROM
yourTable yt
, (SELECT @counter:=0, @prev:=NULL) vars
) sq
GROUP BY number