2

我有一张充满数据的表(大约 20,000 个值)

table_1

ID | name | e-mail (only as an example, it could be just normal TEXT)
1  |alfaa | e-mail alfaa 1
2  |alfaa | e-mail alfaa 2
3  |beta  | e-mail beta
4  |celta | e-mail celta
...

和其他“电子邮件”列为空的相同表,以及一些名称也包含在 table_1 中,但 ID 不同


table_2 (around 5,000 values)

ID | name | e-mail
1  |beta  |
2  |alfaa |
3  |celta |
...

我的问题是,如何使用 table_1 WHERE table_2.name = table_1.name 的电子邮件列中的值填充 table_2 的空电子邮件列?

ID 不同,并且 table_1 包含一些具有相同名称的电子邮件的情况。

(好吧,我想我也可以在没有几封同名电子邮件的情况下管理它)

4

3 回答 3

0

@remram: Thanks, it works. I tried directly with PhpMyAdmin.

Some small modification:

UPDATE table_2, table_1
SET table_2.`email` = table_1.`email`
WHERE table_1.`name` = table_2.`name`;

@HansZ: Thank you also for the DataBase Normalization explanation. In this case, remram solution is what I was needing. I was looking for a kind of Fuzzy VLOOKUP in MySQL, and this would be a way to get what I want

http://denglishbi.wordpress.com/2011/05/15/microsoft-fuzzy-lookup-add-in-for-excel-2010-walkthrough/

And here a small Explanation: I have a list of words that needs to be translated. Some of those words are already in the Master, and the Slave database is empty... At the end, I just need to translate the empty values

于 2013-11-06T19:23:34.790 回答
0

这就是我所拥有的:

UPDATE table_2, table_1
SET table_2.email = table_1.email
WHERE table_1.name = table_2.name;

看到这个sqlfiddle

于 2013-11-06T18:49:43.557 回答
0

让我们谈谈数据库规范化

您发现数据库模式的设计方式存在问题,主要是您将大量数据存储在多个位置。这很容易导致表彼此不同步、浪费存储空间和昂贵的查找。

让我告诉你我在说什么。


案例 1. 同步表。

假设您确实正确填充了 table_1、table_2。你会得到这样的东西:

table_1                        table_2

ID_1 | name | email            ID_2 | name | email
1    | bob  | bob@cat.com      1    | adam | adam@dog.com
2    | adam | adam@dog.com     2    | bob  | bob@cat.com
3    | bob  | bob@dog.com      3    | bob  | bob@dog.com
4    | joe  | joe@dog.com

请注意,我将鲍勃的两封电子邮件存储了两次。这可能看起来不多,但如果 bob 有 5 封电子邮件,并且您添加了 table_3,那么您将存储 15 条记录以仅引用 5 条独特的信息。

现在假设您是 adam,并且您想要更新您的电子邮件,假设您想要将您的电子邮件更改为adam@cat.com. 您在使用 的程序 1 中执行此table_1操作,但您不在使用 的程序 2 中执行此操作table_2。当你点击更新时你会得到什么?

table_1                        table_2

ID_1 | name | email            ID_2 | name | email
1    | bob  | bob@cat.com      1    | adam | adam@dog.com
2    | adam | adam@cat.com     2    | bob  | bob@cat.com
3    | bob  | bob@dog.com      3    | bob  | bob@dog.com
4    | joe  | joe@dog.com

Adam 现在有不同的电子邮件,具体取决于他使用的是程序 1 还是程序 2。因此,要解决此问题,每次更改 table_1 中的内容时都需要通过 table_2,这是一个额外的数据库调用。


案例 2. 内部一致性

现在让我们说鲍勃想把他的名字改成吉尔。现在会发生什么?

table_1                        table_2

ID_1 | name | email            ID_2 | name | email
1    | jill | bob@cat.com      1    | adam | adam@dog.com
2    | adam | adam@dog.com     2    | bob  | bob@cat.com
3    | bob  | bob@dog.com      3    | bob  | bob@dog.com
4    | joe  | joe@dog.com

糟糕,我不小心只更新了表 1 中 bob 对应的一行,现在看来 bob@cat.com 和 bob@dog.com 是两个不同的人,但实际上它们是相同的。所以我必须遍历整个数据库并检查每一行的name = "bob". 然后我必须对 table_2 做同样的事情。您的数据库正在迅速变得难以管理。


数据库规范化

而不是有两张桌子。

table_1                        table_2

ID_1 | name | email            ID_2 | name | email
1    | bob  | bob@cat.com      1    | adam | adam@dog.com
2    | adam | adam@dog.com     2    | bob  | bob@cat.com
3    | bob  | bob@dog.com      3    | bob  | bob@dog.com
4    | joe  | joe@dog.com

取两个表共有的信息,即姓名-电子邮件对,并将其放入用户表中

table_1          table_2          user

ID_1 | userId    ID_2 | userId    userId | name | email
1    | 2         1    | 1         1      | adam | adam@dog.com
2    | 1         2    | 2         2      | bob  | bob@cat.com
3    | 2         3    | 2         2      | bob  | bob@dog.com
4    | 3                          3      | joe  | joe@dog.com

这解决了很多问题,现在当您想要查找用户的姓名/电子邮件时,您可以根据 userId 在用户表中查找它。如果 adam 更改了他的电子邮件,则两个表都会更改(因为它们都引用了 user 表)。

还有一件事,如果 bob 更改了他的名字,我们不应该查看整个用户表来更改他的名字的每个场合。所以我们可以更进一步。

table_1          table_2          user              email

ID_1 | userId    ID_2 | userId    userId | name     userId | email
1    | 2         1    | 1         1      | adam     1      | adam@dog.com
2    | 1         2    | 2         2      | bob      2      | bob@cat.com
3    | 2         3    | 2         3      | joe      2      | bob@dog.com
4    | 3                                            3      | joe@dog.com

现在我们没有多余的信息,不需要重复值,并且任何地方的更改都会影响引用它的所有其他表。

于 2013-11-06T19:05:30.023 回答