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。见答案的附录。