Fassen Sie einige häufige Rankingprobleme in MySQL zusammen

Fassen Sie einige häufige Rankingprobleme in MySQL zusammen

Vorwort:

In manchen Anwendungsszenarien stoßen wir häufig auf Rankingprobleme, beispielsweise beim Ranking nach Klassen oder Alter. Es gibt viele Möglichkeiten zur Rangfolge, z. B. direkte Rangfolge, Gruppenrangfolge, Rangfolge mit Intervallen oder Rangfolge ohne Intervalle usw. Dieser Artikel fasst einige häufige Rangfolgeprobleme in MySQL zusammen.

Erstellen einer Testtabelle

Tabelle scores_tb erstellen (
 id int auto_increment Primärschlüssel,
 xuehao int nicht null, 
 Punktzahl int nicht null
)ENGINE=InnoDB STANDARD-CHARSET=utf8;
in scores_tb (xuehao, score) Werte (1001,89),(1002,99),(1003,96),(1004,96),(1005,92),(1006,90),(1007,90),(1008,94) einfügen;

# Zeigen Sie die eingefügten Daten anmysql> select * from scores_tb;
+----+--------+-------+
| ID | xuehao | Punktzahl |
+----+--------+-------+
| 1 | 1001 | 89 |
| 2 | 1002 | 99 |
| 3 | 1003 | 96 |
| 4 | 1004 | 96 |
| 5 | 1005 | 92 |
| 6 | 1006 | 90 |
| 7 | 1007 | 90 |
| 8 | 1008 | 94 |
+----+--------+-------+

1. Ordentliche Rangliste

Ordnen Sie direkt nach der Punktzahl, beginnend bei 1 und absteigend, ähnlich wie bei der Zeilennummer. Nachfolgend geben wir die Abfrageanweisung und die Rangfolgeergebnisse an.

# Abfrageanweisung SELECT xuehao, score, @curRank := @curRank + 1 AS rank
VON scores_tb, (
SELECT @curRank := 0
)
ORDER BY Punktzahl absteigend;

# Ergebnisse sortieren +--------+-------+------+
| xuehao | Punktzahl | Rang |
+--------+-------+------+
| 1002 | 99 | 1 |
| 1003 | 96 | 2 |
| 1004 | 96 | 3 |
| 1008 | 94 | 4 |
| 1005 | 92 | 5 |
| 1006 | 90 | 6 |
| 1007 | 90 | 7 |
| 1001 | 89 | 8 |
+--------+-------+------+

In der obigen Abfrageanweisung deklarieren wir eine Variable @curRank und initialisieren sie auf 0. Wenn eine Zeile gefunden wird, erhöhen wir die Variable um 1 und verwenden sie als Rangfolge. Wir können sehen, dass es bei dieser Art von Rangliste keine Lücken gibt und einige die gleiche Punktzahl, aber unterschiedliche Ranglisten haben.

2. Gleiche Punktzahlen, gleiche Platzierungen, keine Lücke in der Rangliste

# Abfrageanweisung SELECT xuehao, score, 
FALL
WENN @prevRank = Punktzahl, DANN @curRank
WENN @prevRank := Punktzahl DANN @curRank := @curRank + 1
END AS Rang
VON scores_tb, 
(SELECT @curRank := 0, @prevRank := NULL)
ORDER BY Punktzahl absteigend;

# Ranking-Ergebnisse+--------+-------+------+
| xuehao | Punktzahl | Rang |
+--------+-------+------+
| 1002 | 99 | 1 |
| 1003 | 96 | 2 |
| 1004 | 96 | 2 |
| 1008 | 94 | 3 |
| 1005 | 92 | 4 |
| 1006 | 90 | 5 |
| 1007 | 90 | 5 |
| 1001 | 89 | 6 |
+--------+-------+------+

3. Gleichstand bei den Platzierungen, mit Lücken in den Platzierungen

Eine andere Rangfolgemethode besteht darin, dass derselbe Wert die gleiche Rangfolge hat und die nächste Rangfolge des gleichen Werts ein springender ganzzahliger Wert sein sollte, d. h. es gibt Lücken in der Rangfolge.

# Abfrageanweisung SELECT xuehao, score, rank FROM
(WÄHLEN Sie xuehao, Punktzahl,
@curRank := WENN(@prevRank = Punktzahl, @curRank, @incRank) ALS Rang, 
@incRank := @incRank + 1, 
@prevRank := Punktzahl
VON scores_tb, (
AUSWÄHLEN @curRank := 0, @prevRank := NULL, @incRank := 1
)
ORDER BY Punktzahl absteigend) s;
# Ranking-Ergebnisse+--------+-------+------+
| xuehao | Punktzahl | Rang |
+--------+-------+------+
| 1002 | 99 | 1 |
| 1003 | 96 | 2 |
| 1004 | 96 | 2 |
| 1008 | 94 | 4 |
| 1005 | 92 | 5 |
| 1006 | 90 | 6 |
| 1007 | 90 | 6 |
| 1001 | 89 | 8 |
+--------+-------+------+

Die drei oben vorgestellten Rankingmethoden sind relativ kompliziert umzusetzen. Glücklicherweise wurden in MySQL 8.0 Fensterfunktionen hinzugefügt, und die obige Rangfolge kann mithilfe integrierter Funktionen problemlos erreicht werden.

MySQL 8.0 verwendet Fensterfunktionen zur Implementierung des Rankings

In MySQL 8.0 können Sie die drei Fensterfunktionen ROW_NUMBER(), DENSE_RANK() und RANK() verwenden, um die oben genannten drei Ranglisten zu implementieren. Zu beachten ist, dass der Alias ​​nach as nicht mit dem vorherigen Funktionsnamen identisch sein darf, da sonst ein Fehler gemeldet wird. Im Folgenden finden Sie Beispiele für die Implementierung von Ranglisten durch diese drei Funktionen:

# Drei Anweisungen für die obigen drei Ranglisten select xuehao,score, ROW_NUMBER() OVER(order by score desc) as row_r from scores_tb;
wähle xuehao, score, DENSE_RANK() OVER (sortiere nach score desc) als dense_r aus scores_tb;
wähle xuehao, score, RANK() über (sortieren nach score desc) als r aus scores_tb;

# Eine Anweisung kann auch verschiedene Rankings abfragen SELECT xuehao,score,
 ROW_NUMBER() ÜBER w AS 'row_r',
 DENSE_RANK() ÜBER w AS 'dense_r',
 RANK() ÜBER w AS 'r'
VON `scores_tb`
FENSTER w AS (ORDER BY `score` desc);

# Ranking-Ergebnisse+--------+-------+----------+---------+---+
| xuehao | Punktzahl | Zeile_r | dichtes_r | r |
+--------+-------+----------+---------+---+
| 1002 | 99 | 1 | 1 | 1 |
| 1003 | 96 | 2 | 2 | 2 |
| 1004 | 96 | 3 | 2 | 2 |
| 1008 | 94 | 4 | 3 | 4 |
| 1005 | 92 | 5 | 4 | 5 |
| 1006 | 90 | 6 | 5 | 6 |
| 1007 | 90 | 7 | 5 | 6 |
| 1001 | 89 | 8 | 6 | 8 |
+--------+-------+----------+---------+---+

Zusammenfassen:

Dieser Artikel enthält SQL-Anweisungen zur Implementierung statistischer Rangfolgen in drei verschiedenen Szenarien. Sie können die geeignete Rangfolgelösung basierend auf den unterschiedlichen Geschäftsanforderungen auswählen. Im Vergleich zu MySQL 8.0 stellen wir fest, dass die Rangfolge durch die Verwendung von Fensterfunktionen einfacher erreicht werden kann. Tatsächlich sind die Geschäftsanforderungen viel komplizierter als die von uns angegebenen Beispiele. Es braucht immer noch Zeit, um Erfahrung zu sammeln, um solche Geschäftsanforderungen mit SQL umzusetzen.

Oben finden Sie eine detaillierte Zusammenfassung einiger häufiger Ranking-Probleme in MySQL. Weitere Informationen zum MySQL-Ranking finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • MySQL implementiert Ranking und fragt die angegebene Benutzer-Ranking-Funktion ab (parallele Ranking-Funktion) Beispielcode
  • MySQL-Sortierung zum Abrufen eines Ranking-Beispielcodes
  • MySQL-Seitenzugriffsstatistiken und -Rankings
  • So fügen Sie den Ergebnissen benutzerdefinierter Feldabfragen in MySQL eine Rangfolge hinzu
  • MySQL-Gruppierung, um die ersten paar Datensätze in jeder Gruppe (Ranking) mit Recherche nach „Gruppieren nach“ und „Sortieren nach“ zu erhalten

<<:  Verwendung des Linux-Befehls tr

>>:  Zwei Möglichkeiten, Vue-Benutzer dazu zu bringen, sich über einen längeren Zeitraum ohne Bedienung von der Anmeldeseite abzumelden

Artikel empfehlen

Detaillierte Analyse der MySQL-Optimierung von like und = Leistung

Einführung Die meisten Leute, die schon einmal Da...

Detaillierte Erklärung des Linux-Befehls unzip

Inhaltsverzeichnis 1. Unzip-Befehl 1.1 Syntax 1.2...

Implementierung der vertikalen Zentrierung mit unbekannter Höhe in CSS

Dieser Artikel stellt hauptsächlich die Implement...

Detaillierte Schritte zur Installation von Docker in 5 Minuten

Für die Installation von Docker auf CentOS muss d...

Kompatibilitätsprobleme mit CSS3-Farbverlaufshintergründen

Wenn wir eine Hintergrundfarbe mit Farbverlauf er...

Javascript Blob-Objekt zum Erzielen eines Dateidownloads

Inhaltsverzeichnis veranschaulichen 1. Blob-Objek...

So verwenden Sie CSS, um mehrere Bilder horizontal in der Mitte anzuzeigen

Lassen Sie mich zunächst über die Implementierung...

Zusammenfassung gängiger Fehler beim Entwurf von MySQL-Tabellen

Inhaltsverzeichnis Fehler 1: Zu viele Datenspalte...

Detaillierte Erklärung der Verwendung des chmod-Befehls in Linux

chmod-Befehlssyntax Dies ist die korrekte Syntax ...