【问题标题】:MySQL SUM not working correctly after JOINJOIN 后 MySQL SUM 无法正常工作
【发布时间】:2014-02-05 20:56:04
【问题描述】:

我有 2 个表格,如下所示:

     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,谢谢!

【问题讨论】:

  • 这是正确的date &gt;= '2014-02-02' and date &lt; '2014-02-09' 不在 parentethis 之间吗?
  • 将它们放在括号之间并没有改变任何东西
  • 你能解释一下你想要达到的结果吗?
  • 请提供一些示例数据。

标签: mysql join sum


【解决方案1】:

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

【讨论】:

  • 如果我需要访问两个表中的信息,我将如何总结时间?
【解决方案2】:

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

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

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 上的聚合是无关紧要的。

【讨论】:

    【解决方案3】:

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

    另外,date BETWEEN ? AND ? 优于 date &gt;= ? AND date &lt; ?

    【讨论】:

    • 完全不同意您关于 BETWEEN 日期的建议。它对性能没有影响,但是当 DATETIME 值在起作用时,几乎不可能用 BETWEEN 正确地获得范围的结束。
    • “不可能”是什么意思?你有什么问题?
    • BETWEEN 选择一个包含范围 [begin, end]。当您将它用于tstamp BETWEEN '2014-01-01' AND '2014-01-02' 中的日期时间值时,它会忽略结束日期范围内出现的所有 tstamp 值,除了那些恰好在午夜的值。正确的做法是tstamp &gt;= '2014-01-01' AND tstamp &lt; '2014-01-03'。请注意在该范围的末尾使用&lt; 而不是&lt;=。 BETWEEN 不会那样做。
    • 我非常同意奥利·琼斯的观点。 &gt;=/&lt; 是比较日期的首选方法(有时我很懒,但这是最好的方法)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2023-02-13
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    相关资源
    最近更新 更多