在JOIN之后,MySQL SUM无法正常工作

时间:2014-02-05 20:56:05

标签: mysql join sum

我有两个表如下所示:

     TABLE 1              TABLE 2
user_id | date     accountID | date | hours

而我正试图按周累计小时数。如果我使用以下语句,我会得到正确的结果:

SELECT
    SUM(hours) as totalHours
FROM
    hours
WHERE
    accountID = 244
    AND
    date >= '2014-02-02' and date < '2014-02-09'
GROUP BY
    accountID

但是当我加入这两张桌子时,我得到一个像336640这样的数字应该是12

SELECT
    SUM(hours) as totalHours
FROM
    hours
JOIN table1 ON
    user_id = accountID
WHERE
    accountID = 244
    AND
    date >= '2014-02-02' and date < '2014-02-09'
GROUP BY
    accountID

有谁知道这是为什么?

编辑:结果我只需要添加DISTINC,谢谢!

3 个答案:

答案 0 :(得分:1)

JOIN操作通常在结果表中生成更多行:join的结果是两个连接表中每个可能的行对的行,这些行恰好满足ON子句中选择的标准。如果table1中的多行与hours中的每一行匹配,则您的加入结果将重复hours.accountID和hours.hours多次。因此,将小时数相加会产生很高的结果。

答案 1 :(得分:0)

原因是您要加入的表匹配第一个表中的多个行。这些都加在了一起。

解决方案是在进行连接之前在子查询中进行聚合:

select totalhours
from (SELECT SUM(hours) as totalHours
      FROM hours
      WHERE accountID = 244 AND
            date >= '2014-02-02' and date < '2014-02-09'
      GROUP BY accountID
     ) h join
     table1 t1
     on t1.user_id = h.accountID;

我怀疑你的实际查询更复杂。例如,此查询中未引用table1,因此连接仅对行进行过滤/复制。当您只选择一个帐户时,hours上的汇总无关紧要。

答案 2 :(得分:-1)

您应该指定LEFT JOIN以确保它不会消除不匹配的行。

此外,date BETWEEN ? AND ?优于date >= ? AND date < ?