1、需求
對查詢到的數據去重后用創建時間進行排序
2、產生沖突的語句
select distinct 名稱 from 表 order by 創建時間
錯誤:如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的項就必須出現在選擇列表中。
3、原因
SQL的執行順序問題
網上查了一下資料,原因總結如下:
首先,在mysql中distinct 的執行順序高於order by。
第二,distinct執行時會對查詢的記錄進行去重,產生一張虛擬的臨時表;
第三,order by執行時對查詢的虛擬臨時表進行排序,產生新的虛擬臨時表。
綜合來看,如果order by的字段不在select中,執行sql語句時首先執行distinct,之后產生的虛擬臨時表中沒有order by的字段,所以再執行order by時會報錯。
4、解決方法
將問題分解為兩個步驟做處理
1、排序:
select 名稱 from 表 order by 創建時間
2、在1的基礎上去重
select a.名稱 from 表名 where 主鍵 in(select max(主鍵) from 表名 group by 要去重的字段 ) a order by a.創建時間
