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

js canvas realisiert Bilder mit abgerundeten Ecken

In diesem Artikel wird der spezifische Code von J...

Zusammenfassung der Wissenspunkte zum Ereignismodul in Node.js

Durch das Studium und die Anwendung von Node wiss...

Detaillierte Erklärung des Vue-Lebenszyklus

Inhaltsverzeichnis Warum den Lebenszyklus versteh...

Beispiel einer langsamen MySQL-Abfrage

Einführung Durch Aktivieren des Slow Query Log ka...

Zusammenfassung zum Hinzufügen von Root-Berechtigungen für Benutzer in Linux

1. Fügen Sie einen Benutzer hinzu . Verwenden Sie...

jQuery benutzerdefinierter Lupeneffekt

In diesem Artikelbeispiel wird der spezifische Co...

So entwerfen und erstellen Sie adaptive Webseiten

Mit der Verbreitung von 3G nutzen immer mehr Mens...

Berechnung des Prozentwerts, wenn die CSS-Positionseigenschaft absolut ist

Wenn die Position absolut ist, wird der Prozentsa...

CSS erzielt den Effekt der Vermischung zweier Elemente (Sticky-Effekt)

Ich erinnere mich, dass es vor ein paar Jahren in...

Einführung in Keyword-Design-Methoden im Webdesign

Häufig ignorieren wir beim Erstellen der Homepage ...