我想合并3个表(2个来自同一个DB,另一个来自另一个DB) 每个都包括电子邮件。
目标是创建一个独特的"电子邮件(没有双重电子邮件)
我首先只尝试过一个DB:
SELECT email FROM db1.table1 group by email
UNION ALL
SELECT email FROM db1.table2 group by email
工作正常。
目前我从其他数据库中添加表格
SELECT email FROM db1.table1 group by email
UNION ALL
SELECT email FROM db1.table2 group by email
UNION ALL
SELECT email FROM db2.table1 group by email
我得到了
1271 - 非正式混合操作' UNION'
任何帮助如何实现我的目标。 (我尝试通过PHP,逐行比较,如果电子邮件已经在新数据库中列出,每个表200k电子邮件,它需要HOURS)
更新: 感谢您的评论。
1#UNION而不是UNION ALL来获取UNIQUE电子邮件。 2#SELECT电子邮件COLLATE utf8_general_ci来自db1.table1 group by email
通过COLLATE我再也不会收到此错误。
现在似乎工作了。我会进一步检查,而不是关闭这个问题。 谢谢
答案 0 :(得分:0)
作为错误状态,应该有不同的排序'你的专栏
select collation(email) from db1.table1
select collation(email) from db2.table1
如果两个查询都返回不同的值,那么您需要一列的collation
。
示例查询将其转换为如下:
SELECT email FROM db1.table1 group by email
UNION
SELECT email FROM db1.table2 group by email
UNION
SELECT
email COLLATE utf8_general_ci
FROM db2.table1 group by email
答案 1 :(得分:0)
为什么不使用多步骤流程?
要获得独特的电子邮件,您可以将所有内容放在一个表格中。您甚至不需要查询,您可以使用任何数据库工具导出,修改和导入行。之后,您可以删除重复项:
ALTER IGNORE TABLE allEmails ADD UNIQUE (email)
然而,这可能会很慢,特别是如果email
是TEXT并且没有索引。要解决这个问题,您可以为每封电子邮件制作一个哈希值。创建一个名为hash
的列:
ALTER TABLE allEmails ADD hash VARCHAR(35), ADD INDEX (`hash`)
并填充:
UPDATE allEmails SET hash = MD5(email);
现在你可以利用这样的索引来利用较短的哈希:
ALTER IGNORE TABLE allEmails ADD UNIQUE (hash)
之后您可以删除哈希列。现在这应该是一个没有重大瓶颈的过程。
答案 2 :(得分:0)
感谢所有帮助,对我工作:
1#UNION而不是UNION ALL来获取UNIQUE电子邮件。
2#SELECT电子邮件COLLATE utf8_general_ci来自db1.table1 group by email