我有如下這張表的數據,需要根據mobile電話號碼分組,每條電話取最新的數據
方案1: SELECT * from (SELECT * from model_online_forecastscore_phone0001 ORDER BY id DESC) as cn GROUP BY cn.mobile
方案2:(最佳方案):
SELECT m1.*
FROM model_online_forecastscore_phone m1 LEFT JOIN model_online_forecastscore_phone m2
ON (m1.mobile = m2.mobile AND m1.id < m2.id) WHERE m2.id is NULL;
可以看到通過explain 看執行效率非常高,這個通過left join的知識點可以參考
http://www.mysqltutorial.org/mysql-left-join.aspx
1.不加 m1.id < m2.id 和where子句
SELECT m1.*,m2.*
FROM model_online_forecastscore_phone0001 m1 LEFT JOIN model_online_forecastscore_phone0001 m2
ON (m1.mobile = m2.mobile)
2..不加where條件查看結果
SELECT m1.*,m2.*
FROM model_online_forecastscore_phone0001 m1 LEFT JOIN model_online_forecastscore_phone0001 m2
ON (m1.mobile = m2.mobile AND m1.id < m2.id)
通過左連接將mobile*mobile結果累積.
關鍵在於左連接會以左表作為基准,如果右表沒有符合條件的會以null補充。
參考:https://stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each-group-mysql