我有以下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
答案 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}}?