首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql排序-对一些排序而不是其他排序?

Mysql排序-对一些排序而不是其他排序?
EN

Stack Overflow用户
提问于 2014-08-22 22:22:20
回答 1查看 31关注 0票数 1

好的,下面是我的问题:

代码语言:javascript
复制
SELECT NAME, 
       DATE_FORMAT(DATE_WRITTEN, "%c/%e/%y") AS written_date, 
       DATE_FORMAT(RETURN_DATE, "%c/%e/%y")  AS return_date 
FROM   `pfp`.`returns` AS `Re` 
       LEFT JOIN `pfp`.`insurance` AS `Insurance` 
              ON ( `insurance`.`id` = `Re`.`INSURANCE_ID` ) 
       LEFT JOIN `pfp`.`remain` AS `Remain` 
              ON ( `remain`.`id` = `Re`.`REMAIN_ID` ) 
       LEFT JOIN `pfp`.`formula` AS `Formula` 
              ON ( `formula`.`id` = `remain`.`FORMULA_ID` ) 
WHERE  `NOT_RETURNED` = 'F' 
       AND `RETURN_DATE` BETWEEN '2014-01-01' AND '2014-08-22' 
ORDER  BY `RETURN_DATE` DESC 
LIMIT  100 

问题是,它按日期14-8-9向下排序到14-8-7,然后跳回到14-8-22,然后从那里向下...为什么??

EN

回答 1

Stack Overflow用户

发布于 2014-08-22 22:27:11

return_date排序时,将按格式化别名排序。而是使用表别名来标识您确实需要该列:

代码语言:javascript
复制
WHERE  `NOT_RETURNED` = 'F' 
       AND `RETURN_DATE` BETWEEN '2014-01-01' AND '2014-08-22' 
ORDER  BY re.RETURN_DATE DESC 
LIMIT  100 

我猜它在re表中。使用适当的别名。

编辑:

首先搜索列别名的事实是documented

MySQL通过先在FROM子句的表列中搜索select_expr值来解析ORDER BY子句中的非限定列或别名引用。对于GROUP BY或HAVING子句,它在搜索select_expr值之前先搜索FROM子句。(对于GROUP BY和HAVING,这与MySQL 5.0之前的行为不同,后者使用与ORDER BY相同的规则。)

我可以推测原因(我认为这与ANSI标准一致)。SQL查询按照特定的顺序进行逻辑处理,例如from,然后是where,然后是select,最后是order by (省略了其他子句)。此逻辑处理确定如何编译查询以及标识符的含义。逻辑处理解释了为什么where子句中不允许使用列别名--从编译器的角度来看,它们还没有被识别。

当涉及到order by时,标识符是从内到外确定的。第一个定义是select中的版本,因此它在转到from之前选择该版本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25449237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档