2014-07-25 77 views
1

我有一個表是這樣的:有條件填充新列

[C1] [C2] [C3] [C4] 
    a1 b1 c1 val1 -- group 1 
    a1 b1 c1 val2 -- group 1 
    a1 b1 c1 val3 -- group 1 

    a2 b2 c2 val1 -- group 2 
    a2 b2 c2 val2 -- group 2 

    a3 b3 c3 val1 -- group 3 
    a3 b3 c3 val2 -- group 3 

我想生成值的新列[c5],爲[c1][c2][c3]每個組合。所需的輸出會是這樣的:

[C1] [C2] [C3] [C4] [c5] 
    a1 b1 c1 val1  1 
    a1 b1 c1 val2  2 
    a1 b1 c1 val3  3 

    a2 b2 c2 val1  1 
    a2 b2 c2 val2  2 

    a3 b3 c3 val1  1 
    a3 b3 c3 val2  2 

對於每組[c1][c2][c3],它將始終是相同的。您可以將3列的組合視爲主鍵。

+0

你想這只是爲了選擇或你想插入命令? –

+0

@JorgeCampos我需要創建另一列並更新新列。 – Boxuan

+0

我明白了。然後這個措辭有點誤導。不要使用術語「自動增量」,這表明您希望在插入時自動生成值。 – RandomSeed

回答

3

這將需要兩個查詢。首先查詢您需要更改表中添加新列...我只是做了這些VARCHAR作爲那它是什麼樣子在我身邊......

設置:

CREATE TABLE my_table 
(c1 VARCHAR(55) 
,c2 VARCHAR(55) 
,c3 VARCHAR(55) 
,c4 VARCHAR(55) 
); 

INSERT INTO my_table VALUES 
    ('a1' , 'b1' , 'c1', 'val1'), 
    ('a1' , 'b1' , 'c1', 'val2'), 
    ('a1' , 'b1' , 'c1', 'val3'), 

    ('a2' , 'b2' , 'c2', 'val1'), 
    ('a2' , 'b2' , 'c2', 'val2'), 

    ('a3' , 'b3' , 'c3', 'val1'), 
    ('a3' , 'b3' , 'c3', 'val2'); 

FIRST QUERY:

ALTER TABLE my_table 
    ADD COLUMN c5 VARCHAR(55); 

在這裏我們只是增加了一個新的列..稱它爲C5。

第二個查詢:

UPDATE my_table mt, 
(
    SELECT 
     c4, 
     c1, 
     IF(@A = c1, @B := @B + 1, @B := 1) AS new_col, 
     @A := c1 
    FROM my_table 
    CROSS JOIN(SELECT @A := '', @B := 1)t 
) temp 
SET mt.c5 = new_col 
    WHERE mt.c4 = temp.c4 
    AND mt.c1 = temp.c1; 

在這裏,我們做了一些計算,當它到達一個新的做增量每種類型和復位計數。然後在同一查詢更新表

第三個查詢:

SELECT * FROM my_table; 

只是一種看完成的改變。

DEMO

OUTPUT:

+---+---+---+-------+--+ 
|c1 |c2 |c3 |c4  |c5| 
+---+---+---+-------+--+ 
|a1 |b1 |c1 |val1 |1 | 
|a1 |b1 |c1 |val2 |2 | 
|a1 |b1 |c1 |val3 |3 | 

|a2 |b2 |c2 |val1 |1 | 
|a2 |b2 |c2 |val2 |2 | 

|a3 |b3 |c3 |val1 |1 | 
|a3 |b3 |c3 |val2 |2 | 
+---+---+---+-------+--+ 

獎金:

只是爲了好玩,你也可以只運行查詢,如果你不想做一個新列桌子。像這樣:

SELECT c1, c2, c3, c4, new_col as c5 
FROM 
(
    SELECT 
     *, 
     IF(@A = c1, @B := @B + 1, @B := 1) AS new_col, 
     @A := c1 
    FROM my_table 
    CROSS JOIN(SELECT @A := '', @B := 1)t 
) as _outer_ 
+0

在你的紅利上,我對'cross join'有個疑問。我試圖刪除它,併產生相同的輸出。如果我只想選擇,是否有理由進行交叉連接? – Boxuan

+0

@Boxuan是的。你想要做交叉連接的原因是,如果你不這樣做,結果會變得不正確。嘗試運行它沒有交叉連接兩次...基本上,它使變量爲空,每次運行它。 –

+0

我認爲每次'@ A'被重置爲'[c1]'('@A:= c1')中的新值,然後'@ B'被重置爲'1'或'@B + 1'基於'@ A'的條件。我錯了嗎?我也試着用你的例子和我的數據來運行它,評論'交叉連接'的效果很好。感謝你的幫助! – Boxuan