1

我有以下 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
4

1 回答 1

0

正如手册所说:

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

它还

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

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

也许你本来打算GROUP BY currency和选择SUM(logs.amount * ei_relationships.itemprice) AS income

于 2012-05-22T20:05:55.473 回答