@R星校长
update 表1 a1 inner join (select 字段1,字段2 from 表1 where 条件) a2 on 条件
set a1.字段1 = a2.字段2
先造出来一个虚拟表,然后通过更新虚拟表的方式去实现具体的更新;
表:abc
update abc a inner join (select f_id, count(*) co from abc group by f_id) b on a.id = b.f_id
set a.count = b.co
内连接出来的虚拟表是:
abc
表:
a.id | a.f_id | a.count |
---|---|---|
1 | 0 | 0 |
2 | 1 | 0 |
3 | 1 | 0 |
4 | 2 | 0 |
6 | 2 | 0 |
7 | 2 | 0 |
查询结果:
b.f_id | b.co |
---|---|
1 | 2 |
2 | 3 |
虚拟表:
a.id | a.f_id | a.count | b.f_id | b.co |
---|---|---|---|---|
1 | 0 | 0 | 1 | 2 |
2 | 1 | 0 | 2 | 3 |
然后set a.count = b.co
就ok
了
虽然是操作的虚拟表,但是能影响到具体的实体表啊!!
好了,再看下这个sql
:
update
abc a
inner join
(select f_id, count(*) as co
from abc group by f_id) b
on
a.id = b.f_id
set
a.count = b.co
我们也换一下用左联接
注意:(更新的是虚拟表左边的字段,左联接可以保证虚拟表左边的字段都有实体表字段相对应,不至于
set
的对象是个null
,set
的值是个null
不怕,但是把一个值set
给null
就有问题了)
update
abc a
left join
(select f_id, count(*) as co from abc group by f_id) b
on
a.id = b.f_id
set
a.count = ifnull(b.co,0) /*左联接有可能右边没有对应的值, 当没有时设置为0)*/
记下来,加强一下印象,也希望能帮助到新手朋友;