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.创建时间

posted @ 2018-12-24 17:02  icebangbang  阅读(4938)  评论(0编辑  收藏  举报