【发布时间】:2017-09-14 16:39:51
【问题描述】:
我正在构建一个多游戏锦标赛记分牌,许多玩家可以在其中玩很多游戏,很多次。我想根据每场比赛的排名而不是他们的实际得分为每场比赛的玩家分配分数。
例如
大金刚
Rank | Player | Score | Points Awarded
1 | Player2 | 34,000 | 1,000
2 | Player1 | 32,000 | 999
3 | Player3 | 29,000 | 998
Robotron
Rank | Player | Score | Points Awarded
1 | Player1 | 39,000 | 1,000
2 | Player3 | 32,000 | 999
3 | Player2 | 21,000 | 998
锦标赛积分榜
Player1 - 1,999 Points
Player2 - 1,998 Points
Player3 - 1,997 Points
到目前为止,我的排名和积分计算工作得很好......
SELECT
`id`,
`userID`,
`gameID`,
`gamescore`,
`rank`,
1001.0 - (rank) AS points
FROM (
SELECT
`id`,
`userID`,
`gameID`,
`gamescore`,
@curr_rank := IF(@prev_rank = id, @curr_rank, @curr_rank + 1) AS rank,
@prev_rank := id
FROM
`submit_score`,
(SELECT @curr_rank := 0) y,
(SELECT @prev_rank := NULL) z
WHERE `submit_score`.`tournID` = 2
ORDER BY `gamescore` DESC
) ranked_game;
但我需要能够按每场比赛的排名来分配积分,然后我可以将每个玩家的总积分显示在一个列表中。
【问题讨论】:
-
首先从关系中分离数据。第二 - 从第 1 名到第 1 名,获得的分数总是相同吗?就是将业务逻辑移到代码中。
-
是的,每个等级的分数总是相同的
-
OK - 所以从数据库中移走该数据,因为这是多余的(以及每场比赛的排名)。然后从查询中为每个游戏创建一个数组(哈希映射),在 Score 列上使用排序
desc(这将为您提供最高分作为排名 1 等),其中键是排名编号,值将是一个数组(列表)的玩家 ID 和分数。通过这种数组循环,您可以创建带有玩家 ID 的临时变量(或再次创建数组),并为他们分配奖励积分。最后,您应该以每个玩家 ID 的总分结束。 -
不能做两次查询?