【问题标题】:Mysql sort - SORTING SOME BUT NOT OTHERS?Mysql sort - 排序一些而不是其他?
【发布时间】:2014-08-23 02:12:13
【问题描述】:

好的,这是我的问题:

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 并从那里向下...为什么??

【问题讨论】:

  • 因为您的日期被转换为字符串。这就是字符串的排序方式。
  • 这是一个超级低效的查询。正如 Siyual 提到的,您需要对基列进行排序,而不是格式化字符串。

标签: mysql sql sorting


【解决方案1】:

当您按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 解析 ORDER BY 中不合格的列或别名引用 通过在 select_expr 值中搜索子句,然后在 FROM 子句中的表。对于 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之前选择那个。

【讨论】:

  • 我很好奇这个,column和alias都是return_date,MySql如何决定实际使用哪个order by?
  • @Andrew 。 . .请参阅答案的附录。
猜你喜欢
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 2013-06-28
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
相关资源
最近更新 更多