在连接表上加入表的总和给出了错误的总数

时间:2015-10-05 12:46:46

标签: mysql

我有三张桌子:

  1. users_timings_log
  2. projects_tasks
  3. projects_modules
  4. 我想计算使用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      |
    +-------+---------------+
    

    我需要的是特定模块的总小时数,但出于某种原因它给了我每个模块相同的时间。

    我坚持下去。我做错了什么?

    提前致谢

1 个答案:

答案 0 :(得分:1)

您需要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子句。

我还添加了表别名,因此查询更容易编写和阅读。

我应该补充一点,您的查询问题在于JOIN没有正确的projects_modules条件。您似乎不需要该表,因此删除表是好的。如果您需要该表中的列,请添加相应的JOIN条件。