Heim > Datenbank > MySQL-Tutorial > So verwenden Sie MySQL-Fensterfunktionen, um ein Listenranking zu erreichen

So verwenden Sie MySQL-Fensterfunktionen, um ein Listenranking zu erreichen

王林
Freigeben: 2023-05-26 10:09:28
nach vorne
969 Leute haben es durchsucht

Erstellen Sie zunächst eine Testtabelle.

create table praise_record(
    id bigint primary key auto_increment,
    name varchar(10),
    praise_num int
) ENGINE=InnoDB;
Nach dem Login kopieren

Dann lassen Sie chatGpt einige Testdaten für uns generieren rank()-Funktion, um die Liste der Likes zurückzugeben, rank() over()

INSERT INTO praise_record (name, praise_num) VALUES ('John', 5);
INSERT INTO praise_record (name, praise_num) VALUES ('Jane', 3);
INSERT INTO praise_record (name, praise_num) VALUES ('Bob', 10);
INSERT INTO praise_record (name, praise_num) VALUES ('Alice', 3);
INSERT INTO praise_record (name, praise_num) VALUES ('David', 7);
INSERT INTO praise_record (name, praise_num) VALUES ('oct', 7);
Nach dem Login kopieren

Bei Verwendung der rank()-Funktion erhält die gleiche Anzahl von Likes das gleiche Ranking und das Ranking kann also springen wird nicht kontinuierlich sein

dense_rank()

Verwenden Sie die Funktion dense_rank(), um die Likes-Liste zurückzugeben, dense_rank() over()

## 注意这里返回的rank字段要用反引号包起来
select name, praise_num, rank() over (order by praise_num desc) as `rank` from praise_record;
+-------+------------+------+
| name  | praise_num | rank |
+-------+------------+------+
| Bob   |         10 |    1 |
| David |          7 |    2 |
| oct   |          7 |    2 |
| John  |          5 |    4 |
| Jane  |          3 |    5 |
| Alice |          3 |    5 |
+-------+------------+------+
Nach dem Login kopieren

Dasselbe wie die Funktion rank(), der gleiche Punkt Die Anzahl der Likes gibt die gleiche Rangfolge zurück, aber die endgültige Rangfolge, die von dense_rank() zurückgegeben wird, ist eine fortlaufende Rangfolge. )-Funktion eignet sich für den Einsatz, wenn die zurückgegebene Liste nur Seriennummern erfordert. Die oben genannten drei Funktionen wurden alle neu zu MySQL 8.0 hinzugefügt, sodass wir sie in alten Versionen wie MySQL 5.7 simulieren und implementieren und mehr über diese drei Fenster erfahren können Das Implementierungsprinzip der Funktion

Simulationsimplementierung der Funktion rank()
 select name, praise_num, dense_rank() over (order by praise_num desc) as `rank` from praise_record;
 
 +-------+------------+------+
| name  | praise_num | rank |
+-------+------------+------+
| Bob   |         10 |    1 |
| David |          7 |    2 |
| oct   |          7 |    2 |
| John  |          5 |    3 |
| Jane  |          3 |    4 |
| Alice |          3 |    4 |
+-------+------------+------+
Nach dem Login kopieren

Wir können die Self-Join-Methode verwenden, um die Datensätze mit einem niedrigeren Wert als dem aktuellen Zeilenwert zu zählen und schließlich 1 zur Zählung hinzuzufügen value als Rangfolge der aktuellen Zeile, die simuliert werden soll. Die Simulationsimplementierung von rank()

dense_rank()

 select name, praise_num, row_number() over (order by praise_num desc) as `rank` from praise_record;
 +-------+------------+------+
| name  | praise_num | rank |
+-------+------------+------+
| Bob   |         10 |    1 |
| David |          7 |    2 |
| oct   |          7 |    3 |
| John  |          5 |    4 |
| Jane  |          3 |    5 |
| Alice |          3 |    6 |
+-------+------------+------+
Nach dem Login kopieren

dense_rank ist der einzige Unterschied, der dazu dient, die Anzahl der Likes zu deduplizieren. Das für unterschiedliche Anzahlen von Likes zurückgegebene Ranking ist eine kontinuierliche Simulationsimplementierung

row_number
select p1.name, p1.praise_num, count(p2.praise_num) + 1 as `rank` from praise_record p1
left join praise_record p2 on p1.praise_num < p2.praise_num
group by p1.name, p1.praise_num
order by `rank`;
+-------+------------+------+
| name  | praise_num | rank |
+-------+------------+------+
| Bob   |         10 |    1 |
| David |          7 |    2 |
| oct   |          7 |    2 |
| John  |          5 |    4 |
| Jane  |          3 |    5 |
| Alice |          3 |    5 |
+-------+------------+------+
Nach dem Login kopieren

Wir können eine rowNum-Variable verwenden, um die Zeilennummer aufzuzeichnen. Die Daten rowNUm jeder Zeile ist +1, sodass wir die Sequenznummer erhalten können wollen

Das obige ist der detaillierte Inhalt vonSo verwenden Sie MySQL-Fensterfunktionen, um ein Listenranking zu erreichen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage