SQL distinct和order by 冲突问题,mysql ,sql

14 篇文章 0 订阅

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值