SQL distinct和order by 沖突問題


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.創建時間


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM