MySQL几乎计算了排名列

时间:2018-01-31 13:00:47

标签: mysql calculated-columns

我有一个表可以保存游戏中的用户分数,结构如下:

user_id (int)
game_id (int)
score (int)

我想在此表中添加另一列,该列将是一个虚拟列,用于保存游戏用户的排名(如表格)。

例如

user_id game_id score rank (virtual)
      1       1    50    1
      2       1    48    2
      3       1    40    3
      2       2    80    1
      1       2    50    2
      3       2    32    3

如您所见,排名列实际上是通过每场比赛中的积分来计算的。

甚至可能吗?如果是这样,我应该在虚拟表达式字段中写什么?

enter image description here

2 个答案:

答案 0 :(得分:1)

这并不能说明关系,但可能会让你开始......

SELECT x.*
     , CASE WHEN @prev = game_id THEN @i:=@i+1 ELSE @i:=1 END rank
     , @prev := game_id
  FROM my_table
     , (SELECT @prev:=null,@i:=0) vars
 ORDER
    BY gamed_id, score DESC;

答案 1 :(得分:1)

不,不可能使用生成的列来计算排名。正如generated columns上的MySQL文档所说:

  

不允许使用子查询,参数,变量,存储函数和用户定义函数。

要计算排名,您必须使用整个表格中的特定顺序来确定记录的位置。这将需要一个可以检查其他记录的表达式。 MySQL中没有这样的函数,不允许子查询。

实现此功能的唯一方法是通过视图,允许您使用变量和子查询来计算排名。

请注意,这可能会随MySQL v8.0而改变,因为它具有rank()和dense_rank()函数。您必须尝试在生成的列中是否允许使用这些函数(我不确定它们是否具有确定性)。