我有两个表如下所示:
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,谢谢!
答案 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 < ?
。