我想找到一种方法来填充缺失的数据,从有数据的记录到没有电子邮件匹配的记录。
我有一张表,上面有姓名、地址、城市、州、 zip 和电子邮件。像这样
kim,,,55555,kim@domain.com
kim,Longmont,CO,55555,kim@domain.com
kim,,,,kim@domain.com
我想做的是删除重复项而不丢失相关数据。所以我想用那里的数据回填每条记录,然后删除重复项。并不总是有像第二条那样包含所有详细信息的记录。有时可能没有包含所有数据的记录。
理想情况下,我希望以以下内容结束,以便每条记录都具有尽可能多的可用字段。如果一个字段有 2 个或更多不同的记录,我可以从第一个开始填写。
我希望这是一个公平的解释
kim,Longmont,CO,55555,kim@domain.com
kim,Longmont,CO,55555,kim@domain.com
kim,Longmont,CO,55555,kim@domain.com
最佳答案
您没有提供任何代码,所以我必须即兴创作。我有两个表 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...
这是我的例子
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)
关于MySQL 回填缺失数据,其中记录有一个公共(public)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11261183/