Mysql 用聚合和注释表

标签 mysql sql

我有两张 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/

相关文章:

php - 简单的 MySQL SELECT 失败,出现错误 1054 Unknown Column

sql - 如何将 LIKE 与列名一起使用

mysql - 由于错误代码 1054,无法插入记录

mysql - 我需要在具有次要条件的 SQL 表中查找/替换值

带有 LIKE 的 PHP MySql 搜索匹配太多行

使用 TYPE=InnoDB 导入 MySQL

php - 2 个准备好的语句,2 个存储过程,1 个 mysqli 连接

sql - PostgreSQL 窗口函数

Java JDBC 连接状态

mysql - 表成表行