mysql - 按条件顺序用其他列值更新 Sql 列

标签 mysql sql

我正在尝试更新我的球员在表中的位置。 该表由名称、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 );

Rextester Demo

关于mysql - 按条件顺序用其他列值更新 Sql 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54063700/

相关文章:

php - SQL 查询执行时间过长

python - 用于获取多个值的 Django MySQL 不同查询

mysql - 无法登录本地Mysql服务器

sql - 在雪花结果集中用逗号分隔输出数字

c# - SQL Server EXP 到数字的精度转换结果丢失

python - 与 microsoft azure sql 数据库的连接在本地环境中有效,但在生产中无效

mysql - 如何找出mysql中加载文件功能中哪一行被破坏

mysqld 未知选项 '--initialize'

sql - PostgreSQL CASE 语句

mysql - SQL 多重 AND 条件