MySql 排行榜 並列與不併列
阿新 • • 發佈:2018-12-09
最近在專案需要有個排行榜,就簡單百度了一下mysql原生的排行榜語句。
一開始找到一條語句,就直接運用給前端,後來發現忘記了存在一個並列和不併列的問題,所以測試的時候就出現了點問題。
下面將會從新建測試資料,然後通過sql語句來演示並列與不併列的場景。
1.首先我們先新建幾條測試資料
DROP TABLE IF EXISTS `sql_test`; CREATE TABLE `sql_test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(11) unsigned NOT NULL, `total_num` tinyint(3) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1; -- ---------------------------- -- Records of sql_rank -- ---------------------------- INSERT INTO `sql_test` VALUES ('1', '100', '50'); INSERT INTO `sql_test` VALUES ('2', '101', '30'); INSERT INTO `sql_test` VALUES ('3', '102', '20'); INSERT INTO `sql_test` VALUES ('4', '103', '60'); INSERT INTO `sql_test` VALUES ('5', '104', '80'); INSERT INTO `sql_test` VALUES ('6', '105', '50'); INSERT INTO `sql_test` VALUES ('7', '106', '70'); INSERT INTO `sql_test` VALUES ('8', '107', '85'); INSERT INTO `sql_test` VALUES ('9', '108', '60'); INSERT INTO `sql_test` VALUES ('10', '109', '100'); INSERT INTO `sql_test` VALUES ('10', '110', '110');
2.先展示並列的語句
SELECT *,(SELECT count(DISTINCT total_num) FROM `sql_test` AS b WHERE a.`total_num` < b.`total_num` )+1 AS rank FROM `sql_test` AS a ORDER BY `rank` limit 0,5
以上就是並列情況下的根據total_num這個欄位降序排名,用limit分頁的話,rank排名也會根據資料分頁進行排名,不會從0開始
3.接下來展示的是不併列的語句
SELECT *,@rank := @rank + 1 AS rank FROM (SELECT * FROM `sql_test` ORDER BY total_num DESC LIMIT 0,5 ) AS obj,(SELECT @rank := 0) r
以上是不併列的sql語句,都是根據total_num進行排名,這種排列方式當到第二頁的時候也會從1開始,因為SELECT @rank := 0這裡設定是從0開始,但是 如果你想像右圖那樣連著排序的話,你可以吧0改為當前頁*每頁顯示數量。例如第一頁為0,第二頁為5.。。類推下去,就可以實現想要的效果了。
以上就是最近碰到的一點小問題,在大部分場景都會應用到的排行榜,我覺得這種原始的sql語句是相對來說最簡單的了。當然也可以用redis的sortset排序,但由於本章主要是介紹mysql的排行榜並列和不併列,所以就不在這裡描述了。