MySQL 基于得分和时间的排名

Posted

技术标签:

【中文标题】MySQL 基于得分和时间的排名【英文标题】:MySQL ranking based on score and time played 【发布时间】:2016-03-18 06:29:49 【问题描述】:

我有两个 mysql 表如下

表格:分数

表:用户

我的要求是对分数进行排名并在总分数大于某个值时检索(例如,如果总分数小于 15,则对所有分数进行排名)。如果分数相等,那么也要考虑时间。

我编写了以下查询来获取包括排名在内的行(我对 SQL 查询不太熟悉,但我试图找到一种方法来做到这一点 - 不走运)。

尝试 - 1

SELECT score.total_score,
       CONCAT(users.user_first_name,' ', users.user_last_name) AS name,
       users.user_email,
       FIND_IN_SET(total_score,
                     (SELECT GROUP_CONCAT(total_score
                                          ORDER BY total_score ASC)
                      FROM score)) AS rank
FROM score
INNER JOIN users ON score.user_id = users.user_id
WHERE score.total_score > 15
ORDER BY score.total_score DESC LIMIT 10

尝试 - 2

SET @Rank := 0;
SELECT score.total_score,score.time,
       CONCAT(users.user_first_name,' ', users.user_last_name) AS name,
       users.user_email,
       @Rank := @Rank + 1 AS rank
FROM score
INNER JOIN users ON score.score_id = users.user_id
WHERE score.total_score > 15
ORDER BY score.total_score DESC, time ASC LIMIT 10

两次尝试都失败了,总之我尝试做的是,

考虑时间,根据total_score对用户分数进行排名(有机会获得相同的分数)。

提前致谢。

【问题讨论】:

你为什么要加入“score_id”和“user_id”?不应该是“ON score.user_id = users.user_id”吗? 1.见标准化。 2. 规范化你的架构。 我强烈建议删除级别 2 到 4 的列。并添加一个新列“级别”。只需在那里设置级别和分数。这样,您是否有 2 个级别或 900 个级别都没有关系。 【参考方案1】:

你可以试试这个。 ORDER BY (score.total_score/score.time)

SET @Rank := 0;
SELECT score.total_score, score.time,
       CONCAT(users.user_first_name,' ', users.user_last_name) AS name,
       users.user_email,
       (@Rank := @Rank + 1) AS rank
FROM score
INNER JOIN users ON score.user_id = users.user_id
WHERE score.total_score > 15
ORDER BY (score.total_score/score.time) ASC LIMIT 10

【讨论】:

你的意思是它不工作?整理好了还是您的意思是您希望字段 rank 也将被修复? 排名字段不固定。 @Nikhil 我更新了它。你可以再试一次。它应该可以完成这项工作。 请参见此处:sqlfiddle.com/#!9/94902/1/1 排名未正确显示。它的主要目的是获取用户的排名。谢谢。 在我的第一种情况下,排名有效,但如果出现平局,则排名无效。所以在这种情况下我需要考虑时间(如果时间更少,那么用户将是第一位的)。

以上是关于MySQL 基于得分和时间的排名的主要内容,如果未能解决你的问题,请参考以下文章

mySQL 求和多行和排名处理关系

HAOI2008排名系统

ACM比赛得分排名,HDU 2093

MySQL跨多列排名

数据结构(Splay平衡树):HAOI2008 排名系统

按排名按顺序设置字段,但在另一个字段的组中