久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL中GROUP BY分組排序獲取topN相關的示例分析

134次閱讀
沒有評論

共計 1340 個字符,預計需要花費 4 分鐘才能閱讀完成。

這篇文章主要介紹 MySQL 中 GROUP BY 分組排序獲取 topN 相關的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

MySQL VERSION:5.5.45
ENGINE   :InnoDB

問題描述:
    獲取成績表中每位同學成績排名前 n 的記錄。

表結(jié)構(gòu):

表數(shù)據(jù):

法一(用戶變量):
①首先我先得到每組排名的所有結(jié)果

點擊 (此處) 折疊或打開

select @gp_row:=if(@name=name,@gp_row+1,1) as gp_row,@name:=name,id,name,grade from td ,(select @gp_row:=0,@name:=) as temp order by name,grade desc;

得到如下結(jié)果:

②在把該結(jié)果作為中間表,查詢 top N 的數(shù)據(jù)

點擊 (此處) 折疊或打開

select id ,name ,grade from (select @gp_row:=if(@name=name,@gp_row+1,1) as gp_row,@name:=name,id,name,grade from td ,(select @gp_row:=0,@name:=) as temp order by name,grade desc) as tb_gp_rank where gp_row

得到結(jié)果如下:

③查看執(zhí)行計劃

我們可以看到,對 td 使用了一個全表掃面(和索引字段相關和 select,where 字段相關等),并且用到了 using filesort,當表記錄數(shù)過多的時候效率肯定不高,這也沒辦法,數(shù)據(jù)無序以及沒有相關索引以及 select 字段還有一些關系,但是這種查詢方式基本可以滿足這一類型的基本需求。

法二(union):
①在知道分組字段的情況下,可以使用 union 合并各組結(jié)果集

點擊 (此處) 折疊或打開

(select id ,name ,grade from td where name= tab order by grade desc limit 2) union (select id ,name ,grade from td where name= lily order by grade desc limit 2);

②查看執(zhí)行計劃

可以發(fā)現(xiàn),在此種表結(jié)構(gòu)下,union 操作會掃 n 次全表(和索引字段相關),即多少個 union 結(jié)果集就有多少次。這種方法還需知道需要分組排序的具體的字段值,使用上有限制。

法三(子查詢):
①子查詢的方式適合選擇并列 top N 的情況

點擊 (此處) 折疊或打開

select a.* from td a where (select count(*) from td where td.name=a.name and td.grade a.grade) 2 order by name,grade desc;

此時在插入一條數(shù)據(jù)  insert into td select null, tab ,76;
再次查詢可得結(jié)果如下

也就是說在排序之后最后一條數(shù)據(jù)如果有重復的則都會作為結(jié)果集返回,即第一次查詢的結(jié)果,tab 成績?yōu)?44 位于第二名的數(shù)據(jù)有兩條。

法四(join 連接):即把子查詢轉(zhuǎn)換為 join 連接,這里就不在測試。

以上是“MySQL 中 GROUP BY 分組排序獲取 topN 相關的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關知識,歡迎關注丸趣 TV 行業(yè)資訊頻道!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-27發(fā)表,共計1340字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關以外文章皆由網(wǎng)絡搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 松江区| 若羌县| 龙川县| 平凉市| 雅江县| 梁平县| 石渠县| 安阳县| 无棣县| 海口市| 荥经县| 龙江县| 丹巴县| 海原县| 蒙阴县| 滦南县| 庆云县| 射洪县| 手机| 绥芬河市| 柘城县| 兴安县| 辰溪县| 酒泉市| 旬邑县| 阿拉善右旗| 淄博市| 德安县| 辉县市| 闵行区| 育儿| 壤塘县| 潜江市| 马山县| 胶州市| 巴里| 平南县| 嘉善县| 怀来县| 鲁山县| 河西区|