如何从一个表中回填缺少的mysql数据?

时间:2014-04-22 19:43:31

标签: mysql

我有一个名为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,我知道该怎么办。

我在网上看到的所有示例都是为了回填多个表格,或者如果它只是一个表格,那么它们就不具备所需的逻辑。

有人可以帮忙,因为这一整天都在煎我的大脑!!

2 个答案:

答案 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 

Fiddle Demo

答案 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;