我有一个数据表(大约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包含一些同名电子邮件的情况。
(好吧,我想我也可以管理它,没有几个同名的电子邮件)
答案 0 :(得分:0)
这就是我所拥有的:
UPDATE table_2, table_1
SET table_2.email = table_1.email
WHERE table_1.name = table_2.name;
请参阅此sqlfiddle
答案 1 :(得分:0)
我们来谈谈Database Normalization。
您发现数据库架构的设计方式存在问题,主要是您在多个位置存储了大量数据。这很容易导致表格彼此不同步,浪费存储空间和昂贵的查找。
让我告诉你我在说什么。
假设您正确填充了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的两封电子邮件。这可能看起来不多,但如果bob有5封电子邮件,并且您添加了table_3,那么您将存储15条记录,仅引用5条独特的信息。
现在让我们说你是adam,并且你想要更新你的电子邮件,假设你想要将你的电子邮件更改为adam@cat.com
。你在使用table_1
的程序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,这是一个额外的数据库调用。
现在让我们说鲍勃想把他的名字改成吉尔。现在发生了什么?
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更改了他的电子邮件,则会更改两个表(因为它们都引用用户表)。
还有一件事,如果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
现在我们没有任何冗余的信息,不需要复制值,任何一个地方的更改都会影响引用它的每个其他表。
答案 2 :(得分:0)
@remram:谢谢,它有效。我直接尝试使用PhpMyAdmin。
一些小修改:
UPDATE table_2, table_1
SET table_2.`email` = table_1.`email`
WHERE table_1.`name` = table_2.`name`;
@HansZ:还要感谢DataBase规范化解释。 在这种情况下,remram解决方案是我需要的。我在MySQL中寻找一种模糊VLOOKUP,这将是一种获得我想要的方式
http://denglishbi.wordpress.com/2011/05/15/microsoft-fuzzy-lookup-add-in-for-excel-2010-walkthrough/
这里有一个小解释:我有一个需要翻译的单词列表。其中一些单词已经在Master中,Slave数据库是空的...最后,我只需要翻译空值