好的,下面是我的问题:
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,然后从那里向下...为什么??
发布于 2014-08-22 22:27:11
按return_date排序时,将按格式化别名排序。而是使用表别名来标识您确实需要该列:
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之前选择该版本。
https://stackoverflow.com/questions/25449237
复制相似问题