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);
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 | +-------+------------+------+
dense_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 kopierenWir 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()
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 | +-------+------------+------+
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 kopierenWir 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!