MySQL 回填缺失数据,其中记录有一个公共(public)字段

标签 mysql database

我想找到一种方法来填充缺失的数据,从有数据的记录到没有电子邮件匹配的记录。

我有一张表,上面有姓名、地​​址、城市、州、 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. 添加其他表并进行一个大查询。
  2. 对要更改的每一列多次应用相同的查询 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/

相关文章:

java - 不保存到 MySQL 数据库中的 Java

MySQL获取结果,总结一下

php - 登录页面检查来自两个不同表的用户名

mysql - 数据库设计通告引用/潜在的不一致

mysql - 乐观锁和交错

查询之间的 MySQL 数据库查询

mysql - 自动增量在 MySQL 中没有重置

mysql - SQL只从一个表连接

php - impresspages 数据库大小为 3mb。 ip_widget 有很多行

sql - 如何创建一个表示字段不等于 X 的联接?