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