MySQL回填缺少数据,其中记录有一个公共字段

时间:2012-06-29 11:45:19

标签: mysql database

我想找到一种方法来填充记录中缺少的数据,这些记录的数据与电子邮件所匹配的数据不同。

我有一张桌子,里面有姓名,地址,城市,州,邮编和电子邮件。像这样

kim,,,55555,kim@domain.com
kim,Longmont,CO,55555,kim@domain.com
kim,,,,kim@domain.com

我想要做的是删除重复项,而不是丢失相关数据。所以我想用每个记录填充那里的数据,然后删除欺骗。并不总是有记录包含所有细节,如第二个。有时可能没有任何记录包含所有数据。

理想情况下,我希望最终得到以下内容,以便每条记录都有尽可能多的字段。如果一个字段有两个或更多不同的记录,我可以从第一个填写。

我希望这是一个公平的解释

kim,Longmont,CO,55555,kim@domain.com
kim,Longmont,CO,55555,kim@domain.com
kim,Longmont,CO,55555,kim@domain.com

1 个答案:

答案 0 :(得分:1)

你没有提供任何代码所以我必须与我一起即兴创作。我有两个表t1和t2,其中t2是t1的完全副本(您可以尝试创建表的副本或使用自联接,我不确定它是否适用于此)。它对我有用:

update t2,t1 set t2.first_name=
case when t2.first_name='' 
then t1.first_name 
else t2.first_name end 
where t2.actor_id=t1.actor_id 
and t1.first_name!='';

我为一个名为first_name的列做了这个。修改查询并将其应用于您的表。所以你有两个选择:

  1. 添加其他表并进行一次大查询。
  2. 为要更改的每个列多次应用相同的查询1 ...
  3. 这是我的例子

    mysql> select * from t2 limit 10;
    +----------+------------+--------------+---------------------+
    | actor_id | first_name | last_name    | last_update         |
    +----------+------------+--------------+---------------------+
    |        1 |            | GUINESS      | 2012-06-29 08:36:22 |
    |        2 |            | WAHLBERG     | 2012-06-29 08:36:22 |
    |        3 |            | CHASE        | 2012-06-29 08:36:22 |
    |        4 |            | DAVIS        | 2012-06-29 08:36:22 |
    |        5 |            | LOLLOBRIGIDA | 2012-06-29 08:36:22 |
    |        6 |            | NICHOLSON    | 2012-06-29 08:36:22 |
    |        7 |            | MOSTEL       | 2012-06-29 08:36:22 |
    |        8 |            | JOHANSSON    | 2012-06-29 08:36:22 |
    |        9 |            | SWANK        | 2012-06-29 08:36:22 |
    |       10 | CHRISTIAN  | GABLE        | 2006-02-15 04:34:33 |
    +----------+------------+--------------+---------------------+
    10 rows in set (0.00 sec)
    
    mysql> select * from t1 order by actor_id limit 10;
    +----------+------------+--------------+---------------------+
    | actor_id | first_name | last_name    | last_update         |
    +----------+------------+--------------+---------------------+
    |        1 | PENELOPE   | GUINESS      | 2006-02-15 04:34:33 |
    |        1 | a          |              | 0000-00-00 00:00:00 |
    |        2 | NICK       | WAHLBERG     | 2006-02-15 04:34:33 |
    |        3 | ED         | CHASE        | 2006-02-15 04:34:33 |
    |        4 | JENNIFER   | DAVIS        | 2006-02-15 04:34:33 |
    |        5 | JOHNNY     | LOLLOBRIGIDA | 2006-02-15 04:34:33 |
    |        6 | BETTE      | NICHOLSON    | 2006-02-15 04:34:33 |
    |        7 | GRACE      | MOSTEL       | 2006-02-15 04:34:33 |
    |        8 | MATTHEW    | JOHANSSON    | 2006-02-15 04:34:33 |
    |        9 | JOE        | SWANK        | 2006-02-15 04:34:33 |
    +----------+------------+--------------+---------------------+
    10 rows in set (0.00 sec)
    
    mysql> update t2,t1 set t2.first_name=case when t2.first_name='' then t1.first_name else t2.first_name end where t2.actor_id=t1.actor_id and t1.first_name!='';
    Query OK, 9 rows affected (0.03 sec)
    Rows matched: 200  Changed: 9  Warnings: 0
    
    mysql> select * from t2 limit 10;
    +----------+------------+--------------+---------------------+
    | actor_id | first_name | last_name    | last_update         |
    +----------+------------+--------------+---------------------+
    |        1 | PENELOPE   | GUINESS      | 2012-06-29 08:37:34 |
    |        2 | NICK       | WAHLBERG     | 2012-06-29 08:37:34 |
    |        3 | ED         | CHASE        | 2012-06-29 08:37:34 |
    |        4 | JENNIFER   | DAVIS        | 2012-06-29 08:37:34 |
    |        5 | JOHNNY     | LOLLOBRIGIDA | 2012-06-29 08:37:34 |
    |        6 | BETTE      | NICHOLSON    | 2012-06-29 08:37:34 |
    |        7 | GRACE      | MOSTEL       | 2012-06-29 08:37:34 |
    |        8 | MATTHEW    | JOHANSSON    | 2012-06-29 08:37:34 |
    |        9 | JOE        | SWANK        | 2012-06-29 08:37:34 |
    |       10 | CHRISTIAN  | GABLE        | 2006-02-15 04:34:33 |
    +----------+------------+--------------+---------------------+
    10 rows in set (0.00 sec)