欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL窗口函數(shù)實(shí)現(xiàn)榜單排名

 更新時(shí)間:2023年04月11日 15:19:36   作者:octobershen  
相信大家在日常的開(kāi)發(fā)中經(jīng)常會(huì)碰到榜單類(lèi)的活動(dòng)需求,本文主要介紹了MySQL窗口函數(shù)實(shí)現(xiàn)榜單排名,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

相信大家在日常的開(kāi)發(fā)中經(jīng)常會(huì)碰到榜單類(lèi)的活動(dòng)需求,通常在榜單中都會(huì)要求返回排名,今天我們就用MySQL的窗口函數(shù)來(lái)快速實(shí)現(xiàn)一下

首先,先建一個(gè)測(cè)試表

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

然后讓chatGpt給我們生成幾條測(cè)試數(shù)據(jù)

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

然后就可以開(kāi)始實(shí)現(xiàn)我們的需求:返回點(diǎn)贊的榜單,并返回排名

rank()

使用rank()函數(shù)返回點(diǎn)贊的榜單, rank() over()

## 注意這里返回的rank字段要用反引號(hào)包起來(lái)
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 |
+-------+------------+------+

可以看到使用rank()函數(shù)的時(shí)候相同的點(diǎn)贊數(shù)會(huì)返回相同的排名,排名會(huì)產(chǎn)生跳躍,最終的排名不是連續(xù)的

dense_rank()

使用dense_rank()函數(shù)返回點(diǎn)贊的榜單, dense_rank() over()

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

與rank()函數(shù)相同的是,相同點(diǎn)贊數(shù)會(huì)返回相同的排名,但是dense_rank()返回的最終排名是連續(xù)的排名

row_number()

row_number()函數(shù)返回點(diǎn)贊的榜單,row_number() over()

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

row_number()函數(shù)適合當(dāng)返回的列表只需要序號(hào)時(shí)使用

以上三個(gè)函數(shù)都是MySQL8.0新加入的,所以在MySQL5.7這些老版本上我們可以模擬實(shí)現(xiàn)一下,順便學(xué)習(xí)一下這三個(gè)窗口函數(shù)的實(shí)現(xiàn)原理

rank()函數(shù)的模擬實(shí)現(xiàn)

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

我們可以使用自聯(lián)接的方式將每個(gè)分?jǐn)?shù)低于當(dāng)前行分?jǐn)?shù)的記錄計(jì)數(shù),最后將計(jì)數(shù)值加1作為當(dāng)前行的排名,來(lái)模擬實(shí)現(xiàn)rank()

dense_rank()的模擬實(shí)現(xiàn)

select p1.name, p1.praise_num, count(distinct p2.praise_num) + 1 as `dense_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 `dense_rank`;
+-------+------------+------------+
| name  | praise_num | dense_rank |
+-------+------------+------------+
| Bob   |         10 |          1 |
| oct   |          7 |          2 |
| David |          7 |          2 |
| John  |          5 |          3 |
| Jane  |          3 |          4 |
| Alice |          3 |          4 |
+-------+------------+------------+

dense_rank的實(shí)現(xiàn)與rank差不多,唯一的區(qū)別是增加了distinct對(duì)點(diǎn)贊數(shù)做了去重,這樣子對(duì)不同的點(diǎn)贊數(shù)返回的排名就是連續(xù)的

row_number的模擬實(shí)現(xiàn)

##使用自定義變量得先初始化
set @rowNum = 0;
select name, praise_num, @rowNum := @rowNum +1 as `row_number`  from praise_record order by praise_num desc ;
+-------+------------+------------+
| name  | praise_num | row_number |
+-------+------------+------------+
| Bob   |         10 |          1 |
| David |          7 |          2 |
| oct   |          7 |          3 |
| John  |          5 |          4 |
| Jane  |          3 |          5 |
| Alice |          3 |          6 |
+-------+------------+------------+

我們可以使用一個(gè)rowNum變量來(lái)記錄行號(hào),每一行的數(shù)據(jù)rowNUm都+1,這樣子就可以得到我們想要的序號(hào)

總結(jié)

1.rank()函數(shù)返回的排名會(huì)產(chǎn)生跳躍

2.dense_rank()函數(shù)返回的排名是連續(xù)的

3.row_number()函數(shù)返回的排名類(lèi)似序號(hào)

4.窗口函數(shù)是MySQL8.0新增的特性,如果在低版本的MySQL要自己模擬實(shí)現(xiàn)一下

到此這篇關(guān)于MySQL窗口函數(shù)實(shí)現(xiàn)榜單排名的文章就介紹到這了,更多相關(guān)MySQL 榜單排名內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL查詢(xún)優(yōu)化:連接查詢(xún)排序limit(join、order by、limit語(yǔ)句)介紹

    MySQL查詢(xún)優(yōu)化:連接查詢(xún)排序limit(join、order by、limit語(yǔ)句)介紹

    兩張表連接查詢(xún)并limit,SQL效率很高,但是加上order by以后,語(yǔ)句的執(zhí)行時(shí)間變的巨長(zhǎng),效率巨低,接下來(lái)為大家介紹下連接查詢(xún)排序limit
    2013-04-04
  • MongoDB日期查詢(xún)操作圖文詳解

    MongoDB日期查詢(xún)操作圖文詳解

    MongoDB中按日期查詢(xún)是一種常見(jiàn)的查詢(xún)操作,而按日期查詢(xún)也是開(kāi)發(fā)人員在MongoDB工作中最常遇到的查詢(xún)?nèi)蝿?wù)之一,這篇文章主要給大家介紹了關(guān)于MongoDB日期查詢(xún)操作的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • mybatis實(shí)戰(zhàn)之?dāng)r截器解讀

    mybatis實(shí)戰(zhàn)之?dāng)r截器解讀

    這篇文章主要介紹了mybatis實(shí)戰(zhàn)之?dāng)r截器解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • MySQL臨時(shí)表的簡(jiǎn)單用法介紹

    MySQL臨時(shí)表的簡(jiǎn)單用法介紹

    這篇文章給大家簡(jiǎn)單介紹了MySQL臨時(shí)表的簡(jiǎn)單用法,對(duì)此有需要的朋友可以跟著學(xué)習(xí)操作下。
    2018-06-06
  • Mysql 用戶(hù)權(quán)限管理實(shí)現(xiàn)

    Mysql 用戶(hù)權(quán)限管理實(shí)現(xiàn)

    MySQL 是一個(gè)多用戶(hù)數(shù)據(jù)庫(kù),具有功能強(qiáng)大的訪問(wèn)控制系統(tǒng),可以為不同用戶(hù)指定不同權(quán)限。本文就來(lái)介紹一下Mysql 用戶(hù)權(quán)限管理實(shí)現(xiàn),感興趣的可以了解一下
    2021-05-05
  • 將MySQL數(shù)據(jù)導(dǎo)出為sql文件的最佳實(shí)踐

    將MySQL數(shù)據(jù)導(dǎo)出為sql文件的最佳實(shí)踐

    這篇文章主要給大家介紹了如何將MySQL數(shù)據(jù)導(dǎo)出為sql文件,避免數(shù)據(jù)丟失的最佳實(shí)踐,文中有詳細(xì)的導(dǎo)出流程步驟,跟著文中的步驟就可以導(dǎo)出文件,需要的朋友可以借鑒參考
    2023-07-07
  • Mysql存儲(chǔ)過(guò)程循環(huán)內(nèi)嵌套使用游標(biāo)示例代碼

    Mysql存儲(chǔ)過(guò)程循環(huán)內(nèi)嵌套使用游標(biāo)示例代碼

    本節(jié)主要介紹了Mysql存儲(chǔ)過(guò)程循環(huán)內(nèi)如何嵌套使用游標(biāo),詳細(xì)實(shí)現(xiàn)如下,需要的朋友不要錯(cuò)過(guò)
    2014-08-08
  • Ubuntu查看修改mysql的登錄名和密碼、安裝phpmyadmin

    Ubuntu查看修改mysql的登錄名和密碼、安裝phpmyadmin

    這篇文章主要介紹了Ubuntu查看修改mysql的登錄名和密碼、安裝phpmyadmin,本文分步驟給大家講解的非常詳細(xì),需要的朋友可以參考下
    2019-11-11
  • MySQL處理JSON常見(jiàn)函數(shù)的使用

    MySQL處理JSON常見(jiàn)函數(shù)的使用

    這篇文章主要介紹了MySQL處理JSON常見(jiàn)函數(shù)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • MySQL控制流函數(shù)(-if?,elseif,else,case...when)

    MySQL控制流函數(shù)(-if?,elseif,else,case...when)

    這篇文章主要介紹了MySQL控制流函數(shù)(-if?,elseif,else,case...when),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07

最新評(píng)論