2016-07-06 17 views
0

我們有一個表,TABLE_1:插入一個新的排名列錯誤

DATA 
1 
2 
3 
4 
5 
NULL 

我們希望基於數據列

DATA,RANK 
1,1 
2,2 
3,3 
4,4 
5,5 
NULL,0 

下生成一個RANK列是我們的代碼:

ALTER TABLE ` TABLE_1` 

ADD COLUMN `RANK` DOUBLE NOT NULL AFTER `DATA`; 

INSERT INTO TABLE_1 

SELECT B.DATA, 

CASE WHEN B.DATA IS NULL THEN 0 ELSE @number := @number + 1 

END RANK 

FROM TABLE_1 B, (SELECT @number := 0 AS BOO) C 

ORDER BY B.RANK; 

以上查詢只會在RANK列中生成0

DATA,RANK 
1,0 
2,0 
3,0 
4,0 
5,0 
NULL,0 

但是,如果我們只是一起運行查詢,而不ALTER TABLE和INSERT INTO像下面,HeidiSQL將返回我們正在尋找

SELECT B.DATA, 

CASE WHEN B.DATA IS NULL THEN 0 ELSE @number := @number + 1 

END RANK 

FROM TABLE_1 B, (SELECT @number := 0 AS BOO) C 

ORDER BY B.RANK; 

表以上腳本將生成一個表,我們正在尋找

DATA,RANK 
1,1 
2,2 
3,3 
4,4 
5,5 
NULL,0 

任何大師能夠啓發爲什麼ALTER TABLE/INSERT INTO不起作用?

的SQL小提琴,請訪問:與內

http://sqlfiddle.com/#!9/d2837/2

+0

這是沒有必要在這裏吶喊你的問題標題。它不會讓你得到更快的幫助,這使得問題更難以閱讀,而且毫無理由地被淘汰是無禮和惱人的。很明顯,您的CAPS LOCK沒有卡住,因爲您設法正確處理了問題本身中的一些文本。請住手。謝謝。 –

+0

爲什麼DOUBLE ?????? – Strawberry

回答

0

使用更新查詢加入

select * from bb; 
    +------+ 
    | data | 
    +------+ 
    | 1 | 
    | 2 | 
    | 3 | 
    | NULL | 
    +------+ 
    4 rows in set (0.00 sec) 
    mysql> ALTER TABLE `bb` ADD COLUMN `RANK` DOUBLE NOT NULL AFTER `DATA`; 
    Query OK, 0 rows affected (0.72 sec) 
    Records: 0 Duplicates: 0 Warnings: 0 


    mysql> UPDATE bb INNER JOIN (SELECT B.DATA as data ,CASE WHEN B.DATA IS NULL THEN 0 ELSE @number := @number + 1 END RANK FROM bb B, (SELECT @number := 0 AS BOO) C ORDER BY B.RANK) TT ON TT.DATA=bb.data set bb.rank=TT.rank; 
    Query OK, 3 rows affected (0.04 sec) 
    Rows matched: 3 Changed: 3 Warnings: 0 

    mysql> select * from bb; 
    +------+------+ 
    | data | RANK | 
    +------+------+ 
    | 1 | 1 | 
    | 2 | 2 | 
    | 3 | 3 | 
    | NULL | 0 | 
    +------+------+ 
    4 rows in set (0.00 sec) 
+0

有趣的解決方案!但是如果表格寬而大(幾百萬行),這會減慢查詢速度嗎? – Chubaka

+0

否排名邏輯不會有任何相當大的影響 –

+0

是否適合您 –