Mysql排序-排序一些,但不排序其他?

Mysql排序-排序一些,但不排序其他?,mysql,sql,sorting,Mysql,Sql,Sorting,好的,我的问题是: 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 (

好的,我的问题是:

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,然后从那里向下。。。为什么???

按返回日期排序时,是按格式化别名排序。相反,请使用表别名来标识您确实需要该列:

WHERE  `NOT_RETURNED` = 'F' 
       AND `RETURN_DATE` BETWEEN '2014-01-01' AND '2014-08-22' 
ORDER  BY re.RETURN_DATE DESC 
LIMIT  100 
我猜它在桌子上。使用适当的别名

编辑:

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

MySQL按顺序解析非限定列或别名引用 子句,然后在 FROM子句中的表。对于GROUP BY或具有子句,它 在select_expr values中搜索之前,先搜索FROM子句。 对于GROUPBY和HAVING,这与MySQL 5.0之前的行为不同 使用了与ORDER BY相同的规则

我可以推测原因,我认为这与ANSI标准是一致的。SQL查询在逻辑上是按特定顺序处理的,比如from、where、select,然后通过省略其他子句来排序。这种逻辑处理决定了如何编译查询以及标识符的含义。逻辑处理解释了where子句中不允许列别名的原因——从编译器的角度来看,它们尚未被识别


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

因为您的日期被转换为字符串。这就是字符串排序的方式。这是一个超级低效的查询。正如Siyual提到的,你需要根据基列排序,而不是格式化的字符串。我对这一个很好奇,列和别名都是return_date,MySql如何决定order by实际使用哪一个?@Andrew。见答案的附录。