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