2013-07-19 102 views
2

我需要爲結果中每行從0開始的連接行中的每個字符串分配一個遞增值。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:[email protected]+1,' ',color SEPARATOR ',') 
FROM table 
GROUP BY number; 

對於每個結果行,變量需要重置爲0。我不是很明顯的專家,我是新來的網站,所以任何幫助非常感謝。

感謝,

周杰倫

+1

你爲什麼要這麼做?你最終想要實現什麼? – Strawberry

+1

同意@Strawberry。在應用層執行分組通常比通過這種方式使用'GROUP_CONCAT()'更好。 – eggyal

+0

事情是,在mysql中沒有'自然順序',所以沒有理由爲什麼紅色應該是0而不是1 – Strawberry

回答

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

你好,謝謝你的回覆。這工作完美。謝謝,周杰倫 – jgc9876

0

如何在2個步驟的解決方案?還是隻有1個SQL查詢?

  1. 創建(ID,顏色)臨時表,聲明ID作爲自動遞增,設置自動增量爲0(ALTER TABLE tbl AUTO_INCREMENT = 0;)你想改變哪個記錄開始
  2. 選擇和插入(INSERT INTO ttTable SELECT color FROM datatable WHERE number = 3) ,然後將它們讀回並通過GROUP_CONCAT生成列表。您必須對原始表格中的所有數字重複此步驟。
+0

您好,非常感謝您的回覆。我需要將其添加到現有的查詢中,因此它需要是1個SQL查詢。謝謝,周杰倫 – jgc9876

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

你好,謝謝你的回覆。這沒有給出預期的結果。這些值不是從零開始,而是不連續的。謝謝,傑伊 – jgc9876

+1

然後改變1爲0,就像我在編輯答案。除此之外,它和草莓一樣。對不起,我留下了一些想法給你。 – fancyPants

3

我知道帶電作業這已被回答,但是這不是一個更簡單的方法嗎?只需將@x:= 0添加到select?

SET @x:= 0;選擇編號,GROUP_CONCAT(@x:= @ x + 1,'',color SEPARATOR','),@ x:= 0 FROM表 GROUP BY編號;

+0

感謝哥們。這是非常有用和最短的解決方案:) – Waqas