2014-07-23 51 views
1

我有一個表user_comission_configuration_history,我需要選擇從user_id最後收預訂費的配置。MySQL的錯誤結果和ORDER BY

元組:

enter image description here

我想有許多疑問,但是,結果是錯的。我最後的SQL:

SELECT * 
    FROM(
     SELECT * FROM user_comission_configuration_history 
     ORDER BY on_date DESC 
    ) AS ordered_history 
WHERE user_id = 408002 
GROUP BY comission_id 

上述查詢的結果是:

enter image description here

但是,正確的結果是:

id user_id comission_id value   type   on_date 
24 408002  12    0,01   PERCENTUAL 2014-07-23 10:45:42 
23 408002  4    0,03   CURRENCY  2014-07-23 10:45:41 
21 408002  6    0,015   PERCENTUAL 2014-07-23 10:45:18 

什麼是錯在我SQL?

+0

可能重複(http://stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each-group) –

+0

是的,響應比爾卡爾文是正確的,更好的表演。關於重複的建議。 – Maykonn

回答

3

這是您的查詢:您查詢

SELECT * 
FROM (SELECT * 
     FROM user_comission_configuration_history 
     ORDER BY on_date DESC 
    ) AS ordered_history 
WHERE user_id = 408002 
GROUP BY comission_id; 

的一個主要問題是,它使用一個MySQL擴展到group by,MySQL的明確警告了。擴展是在select不在所述group by或聚集功能,在使用其他的列。警告(here)是:

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

所以,列中返回的值是不確定

這是一個非常有效的方式得到你想要的(以「comission」的英文拼寫正確)什麼:

SELECT * 
FROM user_commission_configuration_history cch 
WHERE NOT EXISTS (select 1 
        from user_commission_configuration_history cch2 
        where cch2.user_id = cch.user_id and 
         cch2.commission_id = cch.commission_id and 
         cch2.on_date > cch.on_date 
       ) AND 
     cch.user_id = 408002; 
+0

戈登·利諾夫,很好的反應。但結果仍然錯誤。然後將cch.user_id中的第二個WHERE更改爲AND。你的SQL返回2個元組並且user_id 408002的正確元組數爲3。 – Maykonn

+0

2個元組而不是3個元組的原因我認爲是由於cch2.type上的連接。我認爲它應該在comission_ID上給出預期的結果。然而,你的問題的根本原因是擴展組的不確定性。 – xQbert

+0

現在根本原因對我來說可以。謝謝! – Maykonn

1

這裏是做你想要什麼樣的一種方式。它得到每個USER_ID和commissionID最大日期,然後加入這一回基表來限制的結果,只是最大日期爲每個commissionID。 [檢索各組中的最後一個記錄]的

SELECT * 
FROM user_comission_configuration_history A 
INNER JOIN (
     SELECT User_ID, Comission_Id, max(on_Date) mOn_Date 
     FROM user_comission_configuration_history 
     Group by User-Id, Comission_Id 
    ) B 
on B.User_ID = A.User_Id 
and B.Comission_Id = A.Comission_ID 
and B.mOnDate=A.on_date 
WHERE user_id = 408002 
ORDER BY on_Date desc;