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

转载于:https://www.cnblogs.com/Icebang/p/10169607.html