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

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

王林
王林nach vorne
2023-05-26 10:09:28990Durchsuche

Erstellen Sie zunächst eine Testtabelle.

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

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);

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 |
+-------+------------+------+

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 |
+-------+------------+------+

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 |
+-------+------------+------+

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 |
+-------+------------+------+

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen