MySQL用汇总和注释表

时间:2018-10-02 16:51:49

标签: mysql sql

我有两个桌子,像这样

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

1 个答案:

答案 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}}