我需要为结果中每一行开始的连续行中的每个字符串分配一个递增值。
这是一个简化的数据样本:
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。我显然不是专家,而且我是网站的新手所以非常感谢任何帮助。
谢谢,
杰
答案 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查询?
ALTER TABLE tbl AUTO_INCREMENT = 0;
)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