MySQL查询求助:按group_id分组统计子表时间差总和并关联父表
MySQL查询需求:按group_id分组计算子表时间差后求和
需要实现的逻辑:计算子表中隶属于同一parent_id的所有记录的总时间差(秒),要求先按group_id分组计算每组的时间差,再将各组时间差求和后关联父表输出。
表结构
父表(parent)
| id |
|---|
| 1 |
| 2 |
子表(child)
| id | parent_id | group_id | created_at |
|---|---|---|---|
| 1 | 1 | 1 | 2022-01-01 00:00:00 |
| 2 | 1 | 1 | 2022-01-01 00:01:00 |
| 3 | 1 | 2 | 2022-01-01 00:02:00 |
| 4 | 1 | 2 | 2022-01-01 00:04:00 |
| 5 | 2 | 3 | 2022-01-01 00:10:00 |
| 6 | 2 | 3 | 2022-01-01 00:12:00 |
当前查询及问题
当前使用的查询语句:
SELECT id, ( SELECT TIMESTAMPDIFF(SECOND, MIN(created_at), MAX(created_at)) FROM `child` WHERE `parent`.`id` = `child`.`parent_id` LIMIT 1 ) AS `child_elapsed_time_in_seconds` FROM `parent`
查询结果:
| id | child_elapsed_time_in_seconds |
|---|---|
| 1 | 240 |
| 2 | 120 |
问题:该查询直接计算了同一parent_id下所有记录的最大与最小时间差,没有按group_id分组计算后再求和,导致id=1的结果错误(正确应为60+120=180秒)。
期望结果
| id | child_elapsed_time_in_seconds |
|---|---|
| 1 | 180 |
| 2 | 120 |
最终解决方案
参考优化后的查询语句:
SELECT id, ( SELECT SUM(c.elapsed) AS child_elapsed_time_in_seconds FROM ( SELECT group_id, TIMESTAMPDIFF(SECOND, min(created_at), max(created_at)) AS elapsed FROM child WHERE `parent_id` = `parent`.`id` GROUP BY group_id ) AS c ) AS `child_elapsed_time_in_seconds` FROM `parent`
逻辑说明:
- 内层子查询先按
group_id分组,计算每个组内的时间差(秒数); - 外层子查询对同一
parent_id下所有分组的时间差求和; - 最终关联父表的
id输出总时间差。
内容的提问来源于stack exchange,提问作者Mike Mellor
相关产品推荐
相关产品推荐

