2016-07-27 12 views
1

ich eine Abfrage zu implementieren versuchte, dass für jeden Benutzer-ID rangieren die Partitur und verfüllen den Rang Feld, so dassMYSQL Update-Anweisung verfüllen Ranking von jeder ID

id | score | rank 
1 | 100 | 0 
1 | 200 | 0 
1 | 300 | 0 
2 | 100 | 0 
2 | 200 | 0 
3 | 200 | 0 

wird

werden
id | score | rank 
1 | 100 | 3 
1 | 200 | 2 
1 | 300 | 1 
2 | 100 | 2 
2 | 200 | 1 
3 | 200 | 1 
für jede ID

sah ich eine ähnliche Frage hier MySQL update statement to store ranking positions

in meinem Fall jedoch, wie kann ich die ‚Gruppe von id‘ tun?

+0

Es gibt keine Grund, den Rang zu speichern; es kann jederzeit berechnet werden. – user3741598

Antwort

1

Es ist vielleicht nicht die schönste Art und Weise sein, aber man kann so etwas wie leicht tun:

set @rank = 0; 
set @prev = 0; 

select id, score, IF (id = @prev, @rank := @rank + 1, @rank := 1), @prev := id 
from scores 
order by id, score; 

Ich denke, Sie die Update-Anweisung wollen auch, und das wäre:

set @rank = 0; 
set @prev = 0; 

update scores 
set rank = IF(id = @prev, @rank := @rank + 1, @rank := 1), 
id = (@prev := id) 
order by id, score; 
+0

Ich mag Ihre Idee, previous_id Trick zu verwenden! Aber nicht sicher, was die Leistung ist, wenn die Tabelle Millionen von Datensätzen hat. Vielleicht, wenn ich Index auf (ID + Score) erstellen, sollte die Leistung gut sein? –

+0

@FreyaRen "Gut" ist sehr relativ. Ich habe keine Ahnung, in welchem ​​Kontext die Abfrage verwendet wird, oder die genaue Struktur der Tabelle, daher kann ich nicht darauf hinweisen. Alles was ich sagen kann ist, dass die Aktualisierung von "Millionen von Datensätzen" nicht schnell sein wird - egal was Sie tun. – rlanvin