溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-11-01 10:43:51 來源:億速云 閱讀:544 作者:小新 欄目:MySQL數據庫

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

MySQL VERSION : 5.5.45
ENGINE    : InnoDB

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

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

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

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

點擊(此處)折疊或打開

  1. 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;

得到如下結果:
MySQL中GROUP BY分組排序獲取topN相關的示例分析

②在把該結果作為中間表,查詢top N的數據

點擊(此處)折疊或打開

  1. 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<=2;

得到結果如下:
MySQL中GROUP BY分組排序獲取topN相關的示例分析

③查看執行計劃
MySQL中GROUP BY分組排序獲取topN相關的示例分析
我們可以看到,對td使用了一個全表掃面(和索引字段相關和select,where字段相關等),并且用到了using filesort,當表記錄數過多的時候效率肯定不高,這也沒辦法,數據無序以及沒有相關索引以及select字段還有一些關系,但是這種查詢方式基本可以滿足這一類型的基本需求。

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

點擊(此處)折疊或打開

  1. (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);

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

②查看執行計劃
MySQL中GROUP BY分組排序獲取topN相關的示例分析
可以發現,在此種表結構下,union操作會掃n次全表(和索引字段相關),即多少個union結果集就有多少次。這種方法還需知道需要分組排序的具體的字段值,使用上有限制。

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

點擊(此處)折疊或打開

  1. 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;

MySQL中GROUP BY分組排序獲取topN相關的示例分析
此時在插入一條數據 insert into td select null,'tab',76;
再次查詢可得結果如下
MySQL中GROUP BY分組排序獲取topN相關的示例分析
也就是說在排序之后最后一條數據如果有重復的則都會作為結果集返回,即第一次查詢的結果,tab 成績為44位于第二名的數據有兩條。

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女