2

对于结果中的每一行,我需要为从 0 开始的连接行中的每个字符串分配一个递增值。

这是一个简化的数据示例:

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

4 回答 4

3

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

设置@x:=0;

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

于 2014-08-21T15:01:38.613 回答
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     |
 +-----------+-----------------------+
于 2013-07-19T09:27:41.040 回答
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. 您必须对原始表格中的所有数字重复此步骤。
于 2013-07-19T09:12:54.343 回答
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
于 2013-07-19T09:31:29.103 回答