我有一个表可以保存游戏中的用户分数,结构如下:
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
如您所见,排名列实际上是通过每场比赛中的积分来计算的。
甚至可能吗?如果是这样,我应该在虚拟表达式字段中写什么?
答案 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()函数。您必须尝试在生成的列中是否允许使用这些函数(我不确定它们是否具有确定性)。