gpt4 book ai didi

MySQL JOIN 多个查询结果到 1 个结果集

转载 作者:行者123 更新时间:2023-11-29 00:06:10 24 4
gpt4 key购买 nike

我想将多个结果集加入一个键上的 1 个结果。

一共有3张表(我这里只添加相关记录):

Project table : | id | project |

File table : | id | project_id |

Approved table: | file_id | dep1_date | dep2_date | dep3_date |

部门默认是一个日期字符串:0000-00-00 00:00:00第一个查询是:

SELECT project.project, 
SEC_TO_TIME(AVG(TIME_TO_SEC(TIMEDIFF(approved.dep1_date,file.uploaded_datetime)))) as dep1_avg
FROM APPROVED
LEFT JOIN file on file.id = approved.file_id
LEFT JOIN project on project.id=file.project_id
WHERE approved.dep1_date != '0000-00-00 00:00:00'
GROUP BY project.project

它将给我按项目等分组的平均批准时间:

Project    Dep1_avg
project1 01:03:02
project2 04:14:03
project3 00:07:56
...

我也想使用 dep2 和 dep3_date 再运行此查询 2 次,并附加到第一个结果集,但包含不同的 WHERE statament (approved.dep2_date, approved.dep3_date)。

这样看表怎么办?

Project    Dep1_avg Dep2_avg Dep3_avg
project1 01:03:02 04:23:11
project2 04:14:03 11:33:44
project3 00:07:56 00:13:43 32:24:17
...

另外 2 个结果与第一个查询(按项目)相同,如果没有批准等 Dep2 或 Dep3 的一个项目,则它应该为 NULL 或空

查询是什么样的?

谢谢

最佳答案

您不应该使用多个 where 语句来执行此操作,而应该选择是否在 select 本身内将一行包含到 AVG 中。 (可以通过执行多个子查询使用多个 where 语句来完成,但这可能不是很有效。

SELECT project.project, 
SEC_TO_TIME(AVG(IF( approved.dep1_date != '0000-00-00 00:00:00', TIME_TO_SEC(TIMEDIFF(approved.dep1_date,file.uploaded_datetime), NULL))) as dep1_avg
SEC_TO_TIME(AVG(IF( approved.dep2_date != '0000-00-00 00:00:00', TIME_TO_SEC(TIMEDIFF(approved.dep2_date,file.uploaded_datetime), NULL))) as dep2_avg
SEC_TO_TIME(AVG(IF( approved.dep3_date != '0000-00-00 00:00:00', TIME_TO_SEC(TIMEDIFF(approved.dep3_date,file.uploaded_datetime), NULL))) as dep3_avg
FROM APPROVED
LEFT JOIN file on file.id = approved.file_id
LEFT JOIN project on project.id=file.project_id
GROUP BY project.project

NULL 值不包含在 diff 中,所以这基本上只是检查该值是否不应包含,在这种情况下将其换成 NULL,这将被忽略。这使您可以废弃整个 WHERE 子句。

关于MySQL JOIN 多个查询结果到 1 个结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27373518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com