我正在尝试更新我的球员在表中的位置。 该表由名称、id、点和位置组成。
分数的默认值为0
,那么位置将为Unranked
。
如果两个用户有相同的积分,那么他们的位置将是相同的。
演示表
id | name | points | position
1 | a | 0 | Unranked
2 | b | 120 | 2
3 | c | 130 | 3
4 | d | 120 | 1
所需的结果应该是
id | name | points | position
1 | a | 0 | Unranked
2 | b | 120 | 2
3 | c | 130 | 1
4 | d | 120 | 2
查询将类似于未排名的更新 mytable 设置位置 = 'Unranked' 其中点 = 0
我将如何使用积分和位置集查询?
最佳答案
无需在表中保留计算列位置
。以下内容适用于所有版本:
create table tab ( id int, name varchar(1), points int );
insert into tab values
(1,'a', 0),
(2,'b',120),
(3,'c',130),
(4,'d',120);
select t.id, t.name, t.points,
( case when points = 0 then 'Unranked' else t.rnk end ) as position
from
(
select t1.*,
@rnk := if(@pnt = points,@rnk,@rnk + 1) rnk,
@pnt := points
from tab t1
cross join (select @rnk := 0, @pnt := 0 ) t2
order by points desc
) t
order by t.id;
id name points position
-- ---- ------ --------
1 a 0 Unranked
2 b 120 2
3 c 130 1
4 d 120 2
如果您想在表中保留列position
,那么您可以通过主列id
绑定(bind)来使用以下update
语句:
update tab tt
set position = ( select
( case when points = 0 then 'Unranked' else t.rnk end ) as position
from
(
select t1.*,
@rnk := if(@pnt = points,@rnk,@rnk + 1) rnk,
@pnt := points
from tab t1
cross join (select @rnk := 0, @pnt := 0 ) t2
order by points desc
) t
where t.id = tt.id );
关于mysql - 按条件顺序用其他列值更新 Sql 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54063700/