好的,这里很奇怪
我有一个客户数据数据库。我的客户是拥有自己客户的企业。
我有3000个表(每个业务一个),每个表有几千个电子邮件地址。每个表都相同,保存名称。
我需要找到一种方法来查找电子邮件在业务之间交叉的位置(即出现在多个表中)以及它们所在的表的名称。
我已经尝试将所有条目和表名整理到一个表中并使用"组"但是如果没有我们的服务器过度使用,那么数据量太高而无法运行...
有没有人建议如何在不运行3000套连接的情况下完成此操作?
另外,我无法改变AT ALL的数据结构。
由于
编辑:回应那些"有帮助的"重组评论,不是我的数据库,不是我的系统,我几个月前才开始分析数据
答案 0 :(得分:3)
具有相同结构的多个表几乎没有意义,只需business
字段即可修复此结构。如果可能的话你应该修复结构。如果它被强加给你并且你无法改变它,你仍然可以使用它。
从每个表UNION ALL
中选择不同的电子邮件和表名,或将其拉入新表,然后使用GROUP BY
和HAVING
查找包含多个表的电子邮件。
SELECT email
FROM Combined_Table
GROUP BY email
HAVING COUNT(sourc_table) > 1
答案 1 :(得分:0)
因此,您说您无法更改数据结构,但您可以提供兼容的升级。
提供一个新的超级表:
CREATE TABLE business_email (
id_business INT(10) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
PRIMARY KEY id_business, email
) ENGINE = MYISAM;
Myisam引擎让您不必担心交易。
为每个商家信息表添加一个触发器,将电子邮件复制到新信息中:
DELIMITER \\
CREATE TRIGGER TRG_COPY_EMAIL_BUSINESS1 AFTER INSERT OR UPDATE ON business1 FOR EACH ROW
BEGIN
INSERT INTO `business_email` (`id_business`, `email`) VALUES (NEW.`id_business`, NEW.`email`) ON DUPLICATE KEY UPDATE `id_business`=NEW.`id_business`;
END;
\\
DELIMITER ;
您的问题是每当创建新表时动态添加它。它不应该是一个问题,因为你的应用程序代码中已经有了动态DDL。
将所有现有数据复制到新表:
INSERT INTO `business_email` (`id_business`, `email`)
SELECT email FROM business1
UNION
SELECT email FROM business2
...
;
COMMIT;
继续查询新的business_email
表,这应该大大简化:
SELECT `id_business` FROM `business_email`
WHERE
GROUP BY `email`
HAVING COUNT(`email`) > 2;
此查询应易于处理。如果没有,请详细说明问题,因为我认为正确索引的表格应该是一个问题,即使对于数百万行也是如此(自从我们谈论电子邮件以来,我不相信这种情况)
此解决方案的优势在于您可以始终保持最新状态,而不会改变应用程序的工作方式。您只需添加另一个图层即可提供额外的业务价值。