用于返回总体排名的mysql查询

用于返回总体排名的mysql查询,mysql,Mysql,我有一个包含以下数据的用户表: +----+------------+--------------+--------------+--------------+ | id | name | points_game1 | points_game2 | points_game3 | +----+------------+--------------+--------------+--------------+ | 1 | player 1 | 10 |

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

+----+------------+--------------+--------------+--------------+ | id | name | points_game1 | points_game2 | points_game3 | +----+------------+--------------+--------------+--------------+ | 1 | player 1 | 10 | 0 | 5 | | 2 | player 2 | 0 | 25 | 0 | | 3 | player 3 | 30 | 3 | 0 | | 4 | player 4 | 0 | 0 | 20 | +----+------------+--------------+--------------+--------------+ 我希望能够显示整体排名,排名是指整体最高得分,而不是每场比赛的排名。在上面的示例中,我将使用什么查询来显示此结果:

+----+------------+-------+----------------+ | id | name | score | game | +----+------------+-------+----------------+ | 3 | player 3 | 30 | points_game1 | | 2 | player 2 | 25 | points_game2 | | 4 | player 4 | 20 | points_game3 | | 1 | player 1 | 10 | points_game1 | +----+------------+-------+----------------+
以下查询回答了您的问题:

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
有点粗糙,因为最大的重复性。。。计算您可能希望将其放入子查询中


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

您是否考虑过使用UNPIVOT?能否详细说明?在mysqlUNPIVOT中,iv'e从未使用过这一点。让我们把列名作为行的一部分:例如,每名玩家有三行,每行有四列:id、name、game、points。除了我刚刚意识到你在使用MySQL,MySQL不支持UNPIVOT。很抱歉有一个好的解决方法。谢谢!按要求工作。如何将其更改为在子查询中放入最大值?嗯,无法正确设置此注释的格式:“选择id、名称、分数、大小写当points\u game1=分数,然后选择“points\u game1”当points\u game2=分数,然后选择“points\u game2”当points\u game3=分数,然后选择“points\u game3”作为游戏结束*,GREATESTpoints_game1、points_game2、points_game3作为用户按分数顺序选择的分数说明“选择分数是多少?”?还有,哪一个更有效?当像我这样使用内部查询时,必须给它一个别名。这就是赛洛分数。这两种解决方案都不是有效的。后者还生成临时表,因此效率更低。