MySQL update 更新排名列(update + select)

MySQL update 更新排名列(update + select)Subquery returns more than 1 row

突发奇想 假设要填充原表中的排名列应该怎么操作呢?
查了许多教程 发现大部分教你的都是

update 
	tablename 
set 	
	colunm1 = value1,
	colunm2 = value2
where 
	Clause

萌新如果比较生硬地把上面的value换成查询出来的某一列值,就会报错

Subquery returns more than 1 row

假设理想情况下的数据

INSERT INTO student (id,NAME,sex,score,pw) VALUES
	 (1,'张三','男','64',NULL),
	 (2,'李四','女','57',NULL),
	 (3,'王五','男','74',NULL),
	 (4,'赵六','女','84',NULL),
	 (5,'孙七','男','51',NULL),
	 (6,'钱八','女','89',NULL),
	 (7,'周九','女','58',NULL);

假如我们要在排位列(pw)中 分别添加男生的排名和女生的排名,应该怎么操作呢?

首先先把分数排名按性别排出来

select 
	* 
from 
	student
where 
	sex = '男'
order by 
	score desc 

然后就是给他们排个名看看

select  t.*,@i := @i + 1 as rank
from
(select @i := 0 ) r,	
(select 
	* 
from 
	student
where 
	sex = '男'
order by 
	score desc 
	)as t

这里用了自定义变量i
然后就可以更新上去了

update 
	student s 
inner join(
    select  t.*,@i := @i + 1 as rank
	from
	(select @i := 0 ) r,	
	(select 
		* 
	from 
		student
	where 
		sex = '男'
	order by 
		score desc 
	)as t) t1
on s.id = t1.id #这里用id匹配上需要更新的字段 
set s.pw = t1.rank #这里就是更新值啦
where s.sex = '男' #这里其实可以不用加的,但是绝大多数情况下还是要加where条件限制更新的列哦,比如数据量很多的时候一定要看清楚更新的范围

女生也是一样道理
最后结果

在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值