【发布时间】:2023-03-31 07:35:01
【问题描述】:
我执行MySql 查询,在两个不同的表中查找结果。
表格
合同
id, contract, creditor_id, client_id, event_id
发票
id、contract_id、发票、到期、价值
想法是在查询中使用一些参数来选择合约,例如:
initial delay和final,initial value 和 final、事件、债权人。
为此,我使用INNER JOIN、HAVING 和IN。
详情:
收到结果后,我取值并循环对每个查询结果进行更新,使用结果ID。
为了更好的可视化,我在SQL Fiddle 中构建了一个示例。
问题是,当我用很长的结果或数千行查询时,查询真的很慢。
所以,我想知道是否有更好的方法以最佳方式执行相同的查询。
查询:
SELECT `c`.`id`,
`c`.`contract`,
`c`.`creditor_id`,
`c`.`client_id`,
`c`.`event_id`,
`t`.`total_value`,
`delay`
FROM `contract` `c`
INNER JOIN
(SELECT contract_id,
Sum(value) total_value,
Datediff(Curdate(), due) AS delay
FROM invoice t GROUP BY contract_id
HAVING delay <= 99999
AND delay >= 1
AND total_value >= 1
AND total_value < 99999) t ON `t`.`contract_id` = `c`.`id`
WHERE `c`.`creditor_id` = 1
AND `c`.`event_id` IN(4, 7, 5, 8, 13, 3, 6, 15, 2, 24, 1, 21, 20, 14, 17, 18, 16, 23, 25, 22, 9, 10, 26, 12, 19, 11)
【问题讨论】:
-
小提琴链接坏了?
-
还为您的慢查询提供执行计划,如果有的话,还提供两个表上的索引信息
-
乍一看,我可以说你的内部 SELECT 语句肯定会导致延迟
-
当你做
GROUP BY contract_id时,你正在服用哪个due? -
子查询与
sql_mode=only_full_group_by不兼容
标签: mysql sql query-optimization