2012-03-26 150 views
1

我有如下表MYSQL - GROUP BY與MAX問題

Date, TelephoneNumber, Type 
    02/02/12, 123456, b 
    04/02/12, 123456, b 
    07/02/12, 123456, a 
    03/02/12, 789999, a 
    15/02/12, 789999, b 

運行下面的SQL

 select TelephoneNumber, max(Date) as datetime, Type 
     from Table1 
     where Date > '2012-03-25 00:00' 
     group by TelephoneNumber 
     order by date desc; 

我注意到,類型不匹配其相關的日期時。比如我正在

07/02/12, 123456, b 
    15/02/12, 789999, a 

它似乎正在類型中的第一個記錄....即使我倒過來排序。有人能幫我解決這個問題嗎?我正在使用MySQL

在此先感謝。 sandro

+2

MySQL的小組,由功能使用第一個遇到的行填寫在一個結果行任何非分組字段的值。這對於像您的簡單查詢語句是不可避免的。看到這個問答:http://stackoverflow.com/questions/979034/mysql-shows-incorrect-rows-when-using-group-by – 2012-03-26 20:48:31

+0

什麼是你正期望發生。問一個更直接的問題總是更好。 – kasavbere 2012-03-26 21:00:35

回答

3

這個問題似乎很常見。

這裏是我的解決方案:

SELECT TelephoneNumber, Date AS datetime, Type 
from (SELECT * 
     FROM Table1 
     WHERE Date > '2012-03-25 00:00' 
     ORDER BY Date DESC) AS h 
GROUP BY TelephoneNumber 
ORDER BY date DESC; 

Check explanation here

0

訂單在分組後應用。 max(Date)的值已經被計算出來了,你不會以任何方式對它進行排序。另外,什麼是msisdn?你不可能知道你的查詢是怎麼回事,因爲你實際上分組的內容是不透明的。

+0

這是一個錯誤的:)現在請檢查 – mouthpiec 2012-03-26 20:52:22

2

這是因爲,§11.16.3 "GROUP BY and HAVING with Hidden Columns" in the MySQL 5.6 Reference Manual所言:

MySQL的擴展使用GROUP BY使得 選擇列表可參考 GROUP BY子句中未命名的非聚合列。這意味着 前面的查詢在MySQL中是合法的。您可以通過避免不必要的列排序 和分組,使用此功能 獲得更好的性能。但是,這主要適用於在GROUP BY中未命名的每個非聚合列中的所有值 對於每個組都是相同的。 服務器免費爲 從每個組中選擇任何值,因此除非它們相同,否則所選值是不確定的。此外,來自每個組的值的選擇 不能通過添加 ORDER BY子句來影響。結果集 的排序發生在選擇值後,並且ORDER BY不會影響服務器選擇的值。

[重點煤礦]

相反,你需要寫這樣的事:

select t1a.TelephoneNumber, t1a.Date, t1a.Type 
    from Table1 as t1a 
    left 
    join Table1 as t1b 
    on t1b.TelephoneNumber = t1a.TelephoneNumber 
    and t1b.Date > t1a.Date 
where t1a.Date > '2012-03-25 00:00' 
    and t1b.TelephoneNumber IS NULL    -- i.e., the join failed 
; 

找到具有最大Date記錄爲TelephoneNumber每個值。