我有两个桌子,像这样
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
答案 0 :(得分:1)
如果要比较求和值是否匹配,只需在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
,然后就可以对其进行比较。
请尝试以下操作:
alias_id
编辑:如OP's comments所观察到的,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`);
中将是唯一的,则可以使用以下语句(而不是上面的第一条语句):
{{1}}