2016-07-06 39 views
0

Wir haben eine Tabelle, table_1:Legen Sie eine neue Ranking-Spalte Fehler

DATA 
1 
2 
3 
4 
5 
NULL 

Wir wollen eine RANK Spalte erzeugen, basierend auf der DATA-Spalte

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

Hier finden Sie unseren Code:

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; 

Die obige Abfrage generiert nur 0 in der RANK-Spalte

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

Wenn wir jedoch nur die Abfrage entlang laufen, ohne die ALTER TABLE und INSERT INTO wie Folgenden wird HeidiSQL den Tisch kehren wir für

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; 

Das obige Skript eine Tabelle generiert suchen wir suchen

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

Könnte jeder Guru aufklären, warum die ALTER TABLE/INSERT INTO nicht funktioniert?

Die SQL-Geige ist hier verfügbar:

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

+0

Es ist nicht notwendig, hier IHRE FRAGE TITEL brüllen. Es wird deine Hilfe nicht schneller bekommen, es macht die Frage schwieriger zu lesen, und es ist unhöflich und nervig, ohne Grund zu schreien. Es ist klar, dass Ihre FESTSTELLTASTE nicht blockiert ist, weil Sie es geschafft haben, einen Teil des Textes in Ihrer Frage selbst zu erfassen. Bitte hör auf. Vielen Dank. –

+0

Warum DOUBLE ?????? – Strawberry

Antwort

0

Verwendung Update-Abfrage mit INNER JOIN

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

Interessante Lösung! Aber wird dies die Abfrage verlangsamen, wenn eine Tabelle breit und groß ist (ein paar Millionen Zeilen)? – Chubaka

+0

nein die Ranking-Logik wird keine erhebliche Auswirkungen haben –

+0

ist es Arbeit für Sie –