最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

然后讓chatGpt給我們生成幾條測試數(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);

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

rank()

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

## 注意這里返回的rank字段要用反引號(hào)包起來
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)前行的排名,來模擬實(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對點(diǎn)贊數(shù)做了去重,這樣子對不同的點(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變量來記錄行號(hào),每一行的數(shù)據(jù)rowNUm都+1,這樣子就可以得到我們想要的序號(hào)

總結(jié)

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

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

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

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

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

相關(guān)文章

  • MySQL索引失效的八大常見場景及解決方法

    MySQL索引失效的八大常見場景及解決方法

    作為一名Java開發(fā)工程師,在處理高并發(fā)業(yè)務(wù)時(shí),MySQL索引失效是導(dǎo)致系統(tǒng)性能下降的"隱形殺手",本文將結(jié)合實(shí)際案例,深度剖析索引失效的8大常見場景,并提供Java代碼層面的優(yōu)化建議,幫助開發(fā)者避開性能陷阱,需要的朋友可以參考下
    2025-05-05
  • MySql 5.7.17 winx64的安裝配置詳細(xì)教程

    MySql 5.7.17 winx64的安裝配置詳細(xì)教程

    這篇文章主要介紹了MySql 5.7.17 winx64的安裝配置教程,初始化數(shù)據(jù)庫、配置相關(guān)信息的方法在本文中介紹的非常詳細(xì),需要的朋友參考下
    2017-01-01
  • mysql.help_topic生成序列的方法實(shí)現(xiàn)

    mysql.help_topic生成序列的方法實(shí)現(xiàn)

    本文探討了如何使用MySQL的help_topic表生成序列,并介紹了相應(yīng)的SQL查詢語句和實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • 正確理解Mysql中的列索引和多列索引

    正確理解Mysql中的列索引和多列索引

    本篇文章是對Mysql中的列索引和多列索引進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • MySQL 事務(wù)autocommit自動(dòng)提交操作

    MySQL 事務(wù)autocommit自動(dòng)提交操作

    這篇文章主要介紹了MySQL 事務(wù)autocommit自動(dòng)提交操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • MySQL中JSON_CONTAINS用法、語法、示例及其應(yīng)用場景

    MySQL中JSON_CONTAINS用法、語法、示例及其應(yīng)用場景

    這篇文章主要介紹了MySQL中JSON_CONTAINS用法、語法、示例及其應(yīng)用場景的相關(guān)資料,JSON_CONTAINS函數(shù)用于檢查JSON文檔是否包含特定值或?qū)ο?這個(gè)函數(shù)非常適合于處理嵌套的JSON數(shù)據(jù)和靈活的查詢需求,需要的朋友可以參考下
    2024-10-10
  • mysql觸發(fā)器之創(chuàng)建多個(gè)觸發(fā)器操作實(shí)例分析

    mysql觸發(fā)器之創(chuàng)建多個(gè)觸發(fā)器操作實(shí)例分析

    這篇文章主要介紹了mysql觸發(fā)器之創(chuàng)建多個(gè)觸發(fā)器操作,結(jié)合實(shí)例形式分析了mysql創(chuàng)建及使用多個(gè)觸發(fā)器的相關(guān)操作技巧,需要的朋友可以參考下
    2019-12-12
  • MySQL prepare原理詳解

    MySQL prepare原理詳解

    這篇文章主要介紹了MySQL prepare的相關(guān)內(nèi)容,包括prepare的產(chǎn)生,在服務(wù)器端的執(zhí)行過程,以及jdbc對prepare的處理以及相關(guān)測試,需要的朋友可以了解下。希望對大家有所幫助。
    2017-09-09
  • Mysql 行級鎖的使用及死鎖的預(yù)防方案

    Mysql 行級鎖的使用及死鎖的預(yù)防方案

    mysql的InnoDB,支持事務(wù)和行級鎖,可以使用行鎖來處理用戶提現(xiàn)等業(yè)務(wù)。使用mysql鎖的時(shí)候有時(shí)候會(huì)出現(xiàn)死鎖,要做好死鎖的預(yù)防。這篇文章通過實(shí)例應(yīng)用給大家講解
    2016-12-12
  • Mysql using使用詳解

    Mysql using使用詳解

    本文主要介紹了Mysql using使用詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評論

彭阳县| 望城县| 苍梧县| 哈尔滨市| 潼南县| 沙田区| 邢台市| 金平| 彝良县| 大兴区| 巴塘县| 沈阳市| 岫岩| 宁都县| 乌苏市| 确山县| 岳阳县| 金阳县| 宝丰县| 曲靖市| 车险| 当阳市| 张家界市| 利辛县| 宁乡县| 凤翔县| 天峻县| 古交市| 保亭| 三台县| 郁南县| 新晃| 灵宝市| 长宁县| 平利县| 云和县| 韶山市| 四会市| 忻城县| 怀远县| 大宁县|