我有一个名为employee的MySQL表,如下所示:
ID | User | Phone_No | Phone_No_Count
1 | Fred | 9999 | 1
2 | John | 8888 | 2
3 | Pablo | 123 | 1
4 | John | | 0
5 | John | 8888 | 2
6 | Pablo | | 0
7 | John | 456 | 1
Phone_No_Count是Phone_No列的计数,如果没有Phone_No则将Phone_No_Count设置为零。
我想使用具有最高Phone_No_Count的Phone_No条目回填缺少的Phone_No条目。
e.g。用户John有2个Phone_No'(8888和456)所以我只想使用8888,因为它具有最高的Phone_No_Count(2)
员工中的回填数据将如下所示:
ID | User | Phone_No | Phone_No_Count
1 | Fred | 9999 | 1
2 | John | 8888 | 2
3 | Pablo | 123 | 1
4 | John | 8888 | 0
5 | John | 8888 | 2
6 | Pablo | 123 | 0
7 | John | 456 | 1
然后我可以单独更新Phone_No_Count,我知道该怎么办。
我在网上看到的所有示例都是为了回填多个表格,或者如果它只是一个表格,那么它们就不具备所需的逻辑。
有人可以帮忙,因为这一整天都在煎我的大脑!!
答案 0 :(得分:0)
进行此类更新的一种方法是,您可以在查询中使用用户定义的变量,并为具有最大电话数的用户(即相关子查询)存储电话,然后将此数据与您的表连接并执行更新
update Table1 t1a
inner join(
select t1.id,
t1.`User`,
@p:= case
when t1.Phone_No is null then @c
else t1.Phone_No END Phone_No,
@c:=(select Phone_No from Table1 where t1.`User`=`User` order by `Phone_No_Count` DESC limit 1 ) max_phone
from Table1 t1,(select @p:=0,@c:=0) t
order by t1.`User`,t1.`Phone_No_Count` DESC
) t2 on(t1a.id=t2.id)
set t1a.Phone_No = t2.Phone_No
答案 1 :(得分:0)
诀窍是获取最高计数的电话号码。不幸的是,MySQL不允许你对正在更新的同一个查询进行子查询,但是你可以通过一个技巧来做到这一点。这允许您使用update
/ join
语法:
update employee e join
(select e.user,
substring_index(group_concat(phone_no order by phone_no_count desc
), ',', 1) as new_phone_no
from employee e
group by e.user
) toupdate
on e.user = toupdate.user
set e.phone_no = toupdate.new_phone_no
where e.phone_no is null;