mysql - 已连接表上的连接的表总和给出了错误的总计

标签 mysql

我有三个表:

  1. user_timings_log
  2. 项目任务
  3. 项目模块

例如,我想计算在 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/

相关文章:

mysql - 并发处理大量插入和查询组合的理想设计

php - MYSQL/PHP 插入日期

mysql - 按桶分组(具有 NULL 值)

mysql - 连接两个表的问题

mysql - 如何使用 Play 2.x 对 MySQL 数据库进行单元测试?

mysql - 如何将现有用户表导入另一个具有不同结构的表?

c# - 如何从类中的函数使用 C# 访问 MySQL 数据库?

MYSQL 在每次调用时切换枚举值

php - 在 CodeIgniter 中检索数据库表注释

mysql - 如何获取没有发票号的订单号