【发布时间】: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 个级别都没有关系。