# 问题

Unknown error 3065

# 推断

sql 语句,select distinct 与 order by 一起用时,order by 字段必须在 select 中

# SQL-99 语法

SQL-99 中,在 select 中使用 distinct 关键字后,在 order by 中出现的字段名称不能超过 select 子句的范围

# 原因

  • mysql 中 distinct 的执行顺序高于 order by
  • distinct 执行时会对查询的记录进行去重,产生一张虚拟的临时表
  • order by 执行时对查询的虚拟临时表进行排序,产生新的虚拟临时表

# 结论

综合来看,如果 order by 的字段不在 select 中,执行 sql 语句时首先执行 distinct,之后产生的虚拟临时表中没有 order by 的字段,所以再执行 order by 时会报错