现在位置:首页 » php/mysql »

mysql求游戏排名

作者: ⁄ 时间:2017年01月16日 ⁄ 分类: php/mysql 评论:0

1.数据结构

CREATE TABLE `active_gamescore` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `active_id` int(11) NOT NULL DEFAULT '0' COMMENT '关联active.id',
  `user_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '参与用户',
  `score` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '分数',
  `created_at` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间(时间戳)',
  PRIMARY KEY (`id`),
  KEY `active_id` (`active_id`) USING BTREE,
  KEY `user_id` (`user_id`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=200001 DEFAULT CHARSET=utf8 COMMENT='活动-小游戏分数记录';


2.数据样例

id active_id user_id score created_at
240075 58 283 300 1483203758
193979 58 283 300 1483203759
66457 58 31 300 1483205803
227883 58 258 300 1483210053
24923 58 295 300 1483210380
97130 58 124 300 1483210871
83280 58 154 300 1483215285
96737 58 75 300 1483217001
114577 58 69 300 1483220107
68010 58 267 300 1483220189
23048 58 281 300 1483223949
168580 58 189 300 1483230406
143775 58 9 300 1483231469
84925 58 21 300 1483232858
161099 58 7 300 1483234003
52420 58 36 300 1483235310
145730 58 75 300 1483237517
67370 58 119 300 1483240950
161060 58 278 300 1483244220
92743 58 123 300 1483251658

3.求:分数最高的头20条记录的sql。
要求:
1.一个user_id只有一个名额,取最高分的那条;
2.同分的取时间靠前的那条

select ta.user_id,ta.max_score,tb.min_time
from (
select a.user_id, max(a.score) max_score from  active_gamescore a where  a.active_id='58' group by a.user_id
) ta
join (
select a.user_id,a.score,min(a.created_at) min_time from active_gamescore a where  a.active_id='58' group by a.user_id,a.score
) tb 
on ta.user_id=tb.user_id and ta.max_score=tb.score

order by ta.max_score desc,tb.min_time asc 
limit 20




目前有 0 条评论