1. 程式人生 > >MySql 排行榜 並列與不併列

MySql 排行榜 並列與不併列

最近在專案需要有個排行榜,就簡單百度了一下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的排行榜並列和不併列,所以就不在這裡描述了。