我有三个表:
- user_timings_log
- 项目任务
- 项目模块
例如,我想计算在 module_ id 2 的任务上花费的总小时数
我使用以下查询:
SELECT SEC_TO_TIME(SUM(TIMESTAMPDIFF(SECOND, `start_date`, `end_date`)))
AS `total_hours`
FROM `users_timings_log`
INNER JOIN `projects_tasks` ON users_timings_log.type_id = projects_tasks.id
LEFT JOIN `projects_modules` ON projects_tasks.module_id = '2'
WHERE `type` = '0'
这是我的users_timings_log
表的结构
+-------+---------------------+---------------------+------+---------+
| ID | start_date | end_date | type | type_id |
+-------+---------------------+---------------------+------+---------+
| 1 | 2015-09-17 09:00:00 | 2015-09-17 19:00:00 | 1 | 28 |
| 2 | 2015-09-17 07:00:00 | 2015-09-17 12:00:00 | 1 | 24 |
| 3 | 2015-09-17 08:00:00 | 2015-09-17 16:15:00 | 1 | 18 |
| 4 | 2015-09-17 10:00:00 | 2015-09-17 17:00:00 | 1 | 24 |
+-------+---------------------+---------------------+------+---------+
这是我的 projects_tasks
表的结构
+-------+---------------+-----------------------------+-----------+
| ID | name | description | module_id |
+-------+---------------+-----------------------------+-----------+
| 18 | First task | Some useless description | 1 |
| 24 | Second task | Another useless description | 2 |
| 28 | Third task | NULL | 3 |
+-------+---------------+-----------------------------+-----------+
projects_modules
表的结构
+-------+---------------+
| ID | name |
+-------+---------------+
| 1 | Module 1 |
| 2 | Module 2 |
| 3 | Module 3 |
+-------+---------------+
我需要的是特定模块的总小时数,但由于某种原因,它为每个模块提供了相同的时间。
我被困住了。我做错了什么?
提前致谢
最佳答案
您需要一个GROUP BY
和正确的JOIN
:
SELECT pt.module_id,
SEC_TO_TIME(SUM(TIMESTAMPDIFF(SECOND, ul.`start_date`, ul.`end_date`)))
AS `total_hours`
FROM `users_timings_log` ul INNER JOIN
`projects_tasks` pt
ON ul.type_id = pt.id
WHERE `type` = '0'
GROUP BY pt.module_id;
如果您只需要一个模块,请为此目的添加一个 WHERE
子句。
我还添加了表别名,因此查询更易于编写和阅读。
我应该补充一点,您的查询的问题是它没有为 projects_modules
提供适当的 JOIN
条件。您似乎不需要该表,因此删除该表就可以了。如果您需要该表中的列,请添加适当的 JOIN
条件。
关于mysql - 已连接表上的连接的表总和给出了错误的总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32949015/