2012-05-17 45 views
1

我有以下2查詢的,但他們返回不同的結果。例如,如果我要求從一個終端總量獲得:456Mysql的組由15分鐘不匹配總額

如果我再問問它在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

由於the manual說:

如果你在不包含GROUP BY子句的語句中使用的一組功能,它相當於組在所有行上。

also說:

MySQL的擴展使用GROUP BY從而選擇列表可參考GROUP BY子句中未命名的非聚合列。這意味着前面的查詢在MySQL中是合法的。您可以使用此功能通過避免不必要的列排序和分組來獲得更好的性能。但是,這對於每個組中未在GROUP BY中命名的每個非聚集列中的所有值都是相同的情況都很有用。服務器可以自由選擇每個組中的任何值,因此除非它們相同,否則所選值是不確定的。

因此,在兩個查詢,所述amount列的總和是通過從itemprice列中的值中的一個相乘;其中這些值MySQL將使用的是不確定的,因此,除非每個記錄具有相同itemprice,所得income也是不確定的。

也許你本來打算GROUP BY currency並選擇SUM(logs.amount * ei_relationships.itemprice) AS income