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条件限制更新的列哦,比如数据量很多的时候一定要看清楚更新的范围
女生也是一样道理
最后结果