15分钟的Mysql组与总和不匹配

时间:2012-05-17 09:21:34

标签: mysql sum

我有以下2个查询,但它们会返回不同的结果。例如,如果我从一个终端请求总金额,我得到:456。

如果我再以15分钟的间隔询问它,计算所有值,我得到474 ......这怎么可能?

我获取总金额的查询如下

SELECT   SUM(logs.amount) * ei_relationships.itemprice as income
  ,      currency
FROM     ei_relationships
  RIGHT OUTER JOIN logs ON ei_relationships.id = logs.ei_relationship_id 
WHERE    ei_relationships.event_id = 1
     AND logs.serial = '5B:13:52:28:71:21:ED:F1'
ORDER BY currency, log_time ASC

这是我的查询以获取相同的数据,但现在将其除以15分钟

SELECT   SUM(logs.amount) * ei_relationships.itemprice as income
  ,      UNIX_TIMESTAMP(log_time) - UNIX_TIMESTAMP(log_time)%(900) as hour
  ,      currency
FROM     ei_relationships
  RIGHT OUTER JOIN logs ON ei_relationships.id = logs.ei_relationship_id
WHERE    ei_relationships.event_id = 1
     AND logs.serial = '5B:13:52:28:71:21:ED:F1'
GROUP BY hour
ORDER BY currency, log_time ASC

1 个答案:

答案 0 :(得分:0)

正如the manual所说:

  

如果在不包含GROUP BY子句的语句中使用组函数,则相当于对所有行进行分组。

also说:

  

MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能。但是,当GROUP BY中未在amount中命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。

因此,在两个查询中,itemprice列的总和乘以itemprice列中的一个值; MySQL将使用哪些值是不确定的,因此,除非每条记录都具有相同的income,否则生成的GROUP BY currency也是不确定的。

也许您打算SUM(logs.amount * ei_relationships.itemprice) AS income并选择{{1}}?