我有两张 table ,它们的样子
t1
alias_id (string, unique)
finished (datetime)
sum (float)
t2
alias_id (string)
sum (float)
表包含付款,每个表大约 80 万条记录。 t1 仅包含每笔付款一次,而 t2 可以有多个具有相同 alias_id 的记录 - 对于某些付款可以包含多个交易。
我需要将 t1 中的总和字段与 t2 中的总和字段之和进行比较,按别名分组。
在 Excel 中执行此操作可行,但很痛苦并且需要大约 4 小时。我尝试将表上传到 mysql 并对其运行查询,惊讶地发现它花了大约 8 个小时才能完成。
我不知道为什么,也许我的查询不好?或者也许按时间和总和分组可以吗?确实可以使用关于完成任务的最佳方法的一般建议。
查询如下。
SELECT
s.alias_id AS id,
s.finished AS finished,
s.sum AS sum,
Sum(b.sum_aggr) AS b_sum
FROM report.rep1 s
LEFT JOIN
( SELECT alias_id, SUM(sum) AS sum_aggr
FROM report.rep2
GROUP BY 1
) b
ON b.alias_id = s.alias_id
GROUP BY 1, 2, 3;
表 DDL:
第一:
CREATE TABLE `rep1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`corp_client_id` longtext,
`agr_name` longtext,
`client_id` longtext,
`order_id` longtext,
`alias_id` longtext,
`due` longtext,
`finished` longtext,
`sum` double NOT NULL,
`currency` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=720886 DEFAULT CHARSET=utf8
第二个:
CREATE TABLE `rep2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`client_id` longtext,
`contract` longtext,
`contract_start_dt` longtext,
`contract_end_dt` longtext,
`country` longtext,
`provider` longtext,
`date` longtext,
`alias_id` longtext,
`transaction_id` longtext,
`payment_transaction` longtext,
`transaction_type` longtext,
`sum` double NOT NULL,
`transaction_type_name` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=655351 DEFAULT CHARSET=utf8
最佳答案
如果您想比较总和是否匹配,只需在 alias_id
上的表之间进行左连接
即可。现在,只需计算第二个表上的 SUM
,然后就可以比较它们。
请尝试以下操作:
SELECT
s.alias_id AS id,
s.finished AS finished,
s.sum AS sum,
SUM(b.sum) AS b_sum
FROM report.rep1 AS s
LEFT JOIN report.rep2 AS s2 ON s2.alias_id = s.alias_id
GROUP BY s.alias_id, s.finished, s.sum
编辑:正如 OP's comments 所观察到的,alias_id
未在任何一个表上建立索引。由于alias_id
字段是longtext类型;它将需要适当的索引,否则无论如何查询都会很慢。现在,longtext
数据类型的字段无法建立索引;因此您需要首先将它们转换为 varchar
数据类型。
ALTER TABLE `rep1` MODIFY COLUMN `alias_id` VARCHAR(255);
ALTER TABLE `rep2` MODIFY COLUMN `alias_id` VARCHAR(255);
您可以按如下方式在两个表上添加索引:
ALTER TABLE `rep1` ADD INDEX alias_id (`alias_id`);
ALTER TABLE `rep2` ADD INDEX alias_id (`alias_id`);
如果 alias_id
在表 rep1
中是唯一的,您可以使用以下语句(而不是上面的第一条语句):
ALTER TABLE `rep1` ADD UNIQUE alias_id (`alias_id`);
关于Mysql 用聚合和注释表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52612932/