2017-10-24 4 views
0

Ich habe eine Benutzer-Tabelle mit jedem der Benutzer insgesamt Ich muss die Rangliste von jedem Benutzer berechnen und speichern.Wie berechnet man die Rangfolge der Benutzer aus der Rangliste

Benutzer Tabelle

+----+------+-------+------+ 
| id | name | total | rank | 
+----+------+-------+------+ 
| 1 | joe | 30 | 0 | 
+----+------+-------+------+ 
| 2 | james| 52 | 0 | 
+----+------+-------+------+ 
| 3 | pia | 44 | 0 | 
+----+------+-------+------+ 
| 4 | jessy| 21 | 0 | 
+----+------+-------+------+ 

erwartete Ergebnis

+----+------+-------+------+ 
| id | name | total | rank | 
+----+------+-------+------+ 
| 1 | joe | 30 | 3 | 
+----+------+-------+------+ 
| 2 | james| 52 | 1 | 
+----+------+-------+------+ 
| 3 | pia | 44 | 2 | 
+----+------+-------+------+ 
| 4 | jessy| 21 | 4 | 
+----+------+-------+------+ 

derzeit i das Ansehen sie durch Total wissen kann durch die Bestellung, aber ich kann das Ranking für jede

SELECT * from users ORDER BY total DESC 
nicht berechnen

Antwort

1

Hier ist eine einfache Abfrage ohne Einbeziehung von Variablen und definierte Benutzern

select id,name,total, 
(
    select count(distinct total) 
    from users b 
    where a.total < b.total 
) +1 rank 
from users a 

Hinweis obiger Abfrage übernimmt auch wenn es eine Verbindung zwischen mehrals 1 Benutzern mit gleicher Gesamt ist so wird es wie gleichen Rang zuweisen in demo user 3,5 & 6 hat den gleichen Gesamtwert so sollten sie denselben Rang

erhalten oder wenn Sie Sie vorhandene Tabelle aktualisieren möchten, können Sie Update-Abfrage als

012 schreiben
update users a 
join (
    select id, 
    (
     select count(distinct total) 
     from users d 
     where c.total < d.total 
) +1 rank 
    from users c 
) b on a.id = b.id 
set a.rank = b.rank 

Demo

+0

danken Ihnen sehr viel für Ihre Zeit, ich habe eine Frage gesagt hat, dass diese Versorgung eines der Bande im Fall nimmt, wo Benutzer von 3,5 und 6 den gleichen Wert haben, kann ich lassen die Abfrage überprüft ein anderes Feld für sie unterschiedliche Ranking haben? – mirvatJ

+1

@mirvatJ Ja, Sie können dies tun, indem Sie die Klausel

1

Wenn Sie nur total Spalte auf den Rang basierend zeigen möchten, wird folgende Abfrage arbeiten:

select users.*, 
      @rank := @rank + 1 as Rank 
    from users 
    cross join (select @rank := 0) r 
    order by total desc; 

Ein weiterer ähnlicher Ansatz:

set @rank := 0; 

select users.*, 
       @rank := @rank + 1 as Rank 
     from users   
     order by total desc; 

Nun, wenn Sie bereits Rang Spalte in Tabelle, mit 0 initialisiert, dann können Sie es mit den tatsächlichen Rang wie folgt aktualisieren:

update users 
    set rank = (@rank := coalesce(@rank, 0) + 1) 
    order by total desc; 

Hoffe, es hilft!

Verwandte Themen