1

我有一个包含以下数据的用户表:

+----+------------+--------------+--------------+- -------------+
| 编号 | 姓名 | points_game1 | 积分游戏2 | points_game3 |
+----+------------+--------------+--------------+- -------------+
| 1 | 玩家 1 | 10 | 0 | 5 |
| 2 | 玩家 2 | 0 | 25 | 0 |
| 3 | 玩家 3 | 30 | 3 | 0 |
| 4 | 玩家 4 | 0 | 0 | 20 |
+----+------------+--------------+--------------+- -------------+

我希望能够显示总体排名,其中排名被定义为总体最高分,而不是每场比赛的排名。因此,在上面的示例中,我将使用什么查询来显示此结果:

+----+------------+--------+----------------+
| 编号 | 姓名 | 分数 | 游戏 |
+----+------------+--------+----------------+
| 3 | 玩家 3 | 30 | points_game1 |
| 2 | 玩家 2 | 25 | 积分游戏2 |
| 4 | 玩家 4 | 20 | points_game3 |
| 1 | 玩家 1 | 10 | points_game1 |
+----+------------+--------+----------------+
4

1 回答 1

0

以下查询回答了您的问题:

SELECT 
  id, 
  name, 
  GREATEST(points_game1, points_game2, points_game3) AS score,
  CASE
    WHEN points_game1 = GREATEST(points_game1, points_game2, points_game3) THEN 'points_game1'
    WHEN points_game2 = GREATEST(points_game1, points_game2, points_game3) THEN 'points_game2'
    WHEN points_game3 = GREATEST(points_game1, points_game2, points_game3) THEN 'points_game3'
  END AS game
FROM
  users
ORDER BY 
  3 DESC

由于 GREATEST(...) 计算的重复性,有点粗糙。您可能希望将其放在子查询中。

在任何情况下,请注意此查询不会使用表上的任何索引,因为 ORDER BY 使用列上的函数——这否定了 MySQL 中键的使用。

于 2012-07-06T17:39:56.157 回答