MySQL 游戏排行榜

今天在坛子上看到了,顺便写下来。

有两种方法:

1、效率不高,因为有子查询。但是简洁。而且我对SOCRES表做了INDEX。所以性能上也差不了多少。

mysql> show create table scores\G
*************************** 1. row ***************************
       Table: scores
Create Table: CREATE TABLE `scores` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `score` int(11) DEFAULT ‘0‘,
  PRIMARY KEY (`id`),
  KEY `k_s` (`score`)
) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC

1 row in set (0.00 sec)

mysql> select count(1) from scores;
+----------+
| count(1) |
+----------+
|  1000000 |
+----------+
1 row in set (0.00 sec)

mysql> select id,score,(select count(1) from scores where score>= (select score
from scores where id = 100 order by score desc limit 1)) as rank from scores whe
re id = 100;
+-----+-------+--------+
| id  | score | rank   |
+-----+-------+--------+
| 100 |    64 | 370311 |
+-----+-------+--------+
1 row in set (1.05 sec)

2、分句完成。效率高。

存储过程:

DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`sp_rank`$$

CREATE PROCEDURE `test`.`sp_rank`(IN str_id int(11))
BEGIN
  -- user‘s score
  DECLARE str_score int;
  -- user‘s rank
  DECLARE rank int;
  select score from scores where id = str_id order by score desc limit 1 into str_score ;
  select count(*) from scores where score >=str_score into rank;
  -- output
  select id,score,rank from scores where id = str_id;
END$$

DELIMITER ;

mysql> call sp_rank(100);
+-----+-------+--------+
| id  | score | rank   |
+-----+-------+--------+
| 100 |    64 | 370311 |
+-----+-------+--------+
1 row in set (1.02 sec)

Query OK, 0 rows affected (1.02 sec)

时间: 2024-08-09 11:07:53

MySQL 游戏排行榜的相关文章

【Redis+PHP】利用redis的zset实现游戏排行榜功能

1.需求:①完成游戏排行榜实时刷新 ②查看当前用户的排名.积分 2.参考文章:https://www.cnblogs.com/clubs/p/11691580.html (博主强推) https://www.cnblogs.com/anny-1980/p/4583806.html  (Redis的ZSET有序集合常用语法) 3.实现原理:不使用MySQL进行存储,改用redis的zset实现,单机支持百万级并发,数据热更新 4.附录我自己封装好的一个laravel5的Redis排行榜类: <?p

游戏排行榜的一种实现

游戏排行榜的一种实现 我是游戏公司小猿一只,做游戏服务器开发.最近公司准备招新的 C++ 程序员,我一般都会问到一个常见的功能,一万人排行榜怎么实现. 得到的答案很多,比如 “1.直接从数据库中读取:2.用 hash 表:3.用一个环形数组:4.这个问题我要仔细考虑一下.” 对于这些答案我是不满意的,因为从事游戏逻辑开发的人,排行榜功能是一个基础功能,出于“优秀”C++ 程序员的本能,应该细想怎样实现之.对这个功能如果仅仅停留在表面,心理大概推测用什么数据结构,在关键性问题上支支吾吾,我可能不大

放松一下】北美小游戏排行榜TOP10——“点击英雄”

大家平时工作都比较忙,在这里推荐一款游戏让大家放松一下,让你体验到指数爆炸般挣钱的快感. 北美小游戏排行榜TOP10--"点击英雄" 简要说明: 游戏可以挂机,关闭电脑,游戏也会自动赚钱(游戏金币) 操作简单,鼠标点击怪物,升级即可 全球点到爆根本停不下来! 游戏地址:http://bbs.phpthinking.com/forum.php?mod=viewthread&tid=135 游戏截图: 快来一起玩到爆吧!

基于Laya游戏引擎实现微信小游戏排行榜

我们都知道,微信小游戏和小程序目前风头十足,很多公司都逐渐增加了相关业务线来迅速推广自己的产品和抢占用户群.说到微信小游戏,就不得不提到排行榜这个功能,就目前游戏行业,似乎都离不开排行榜这个重要功能,用户很大一部分留存都是依仗这个看似不起眼的模块.那么,微信小游戏中具体该如何借助laya引擎实现排行榜这个功能呢?我们先来看一下最终的效果图: 按照微信官方的说法,如果我们要使用微信官方提供的好友关系链的数据,我们就不能直接在项目中绘制排行榜,我们需要借助于开放域来绘制排行榜: ? 如果想要展示通过

游戏排行榜算法设计实现比较

以前在音乐做过一些实时投票,积分排名:单曲.专辑等排行榜:游戏中也有类似的战斗力排行:SNS的游戏又有好友排行等,对于此类的排行算法在此做个总结. 需求背景: 查看前top N的排名用户 查看自己的排名 用户积分变更后,排名及时更新 方案一: 利用MySQL来实现,存放一张用户积分表user_score,结构如下: 取前top N,自己的排名都可以通过简单的sql语句搞定. 算法简单,利用sql的功能,不需要其他复杂逻辑,对于数据量比较少.性能要求不高,可以使用.但是对于海量数据,性能是无法接受

google play SDK 游戏排行榜的接入分享

1.第一步 添加配置文件  <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <meta-data android:name="com.google.android.gms.games.APP_ID" android:value="@strin

豌豆荚游戏排行榜爬虫源码

var configs = { domains: ["apps.wandoujia.com"], scanUrls: ["http://apps.wandoujia.com/api/v1/apps?type=weeklytopgame&max=12&start=0"], contentUrlRegexes: ["http://www\\.wandoujia\\.com/apps/.*"], helperUrlRegexes: [&

用跳表实现游戏排行榜

排行榜有很多种设计方案: 比如数组,排序树,Redis的sort set等,还有这里说的跳表. 先科普一下跳表以及分析一下跳表优劣: 跳表:在普通链表中,给一些节点增加额外的指针,使得这些节点能够一次跨越更多的中间节点,提高了效率. 优点:相比普通链表,由于跳跃的特性,可以节省便利次数,时间复杂度上是O(logN).相比平衡二叉树,在插入和删除操作上,不需要再进行树的平衡等操作. 缺点:有额外指针的空间消耗,在数据量超大的情况下,性能还是会下降. 跳表结构如下: 每个框框表示一个Node,里面存

游戏排行榜系统设计 -- 有感

需求: 1.玩家在点击穿/脱装备需要重新计算战斗力 2.玩家可以查看自己的战斗力及排名 3.战斗力前100名的玩家名称以及战斗力大小随时可以查询,且准确性100% 4.为了准确性,任意两个玩家同时查看自己的战斗力时,战斗力高的玩家排名必须高 5.玩家数量庞大,可能达到百万级别 需求解析: 1.战斗力就是个优先级 2.优先级经常会变化 3.每个玩家的排名都要可查 4.前100名的查询频率很高 5.排名不能太离谱,会很容易穿帮 6.数据量较大 一个节点的信息应该至少包含: 1.玩家名称 2.玩家ID