Mysql表以不同的顺序排序,具有相同的order by子句

时间:2016-04-14 22:16:39

标签: mysql sql-order-by

我注意到以下查询

SELECT * FROM 'mytable' ORDER BY 'myfield'

生成一个非常不同的表格

SELECT id FROM 'mytable' ORDER BY 'myfield'

我订购的字段是日期字段,对于50%的记录,该值为空。此外,如果在我的SELECT子句中,我将每个字段命名为而不是依赖于*,它实现与上面第二个查询相同的顺序。

任何人都可以请说明为什么会这样,以及我可以做些什么来获得一致的订购?

2 个答案:

答案 0 :(得分:3)

如果没有第二级排序,空记录将按引擎所需的任何顺序出现...可能是ID上的索引顺序,或涉及日期的复合索引。如果您希望按日期字段确定一致的订购顺序,则表格的主键。如果不存在主键,则需要按使记录唯一的所有列进行排序。

所以..

SELECT id FROM `mytable` ORDER BY `myfield`, `PK`

VS

SELECT * FROM `mytable` ORDER BY `myfield`, `PK`

会产生相同的订单。

答案 1 :(得分:0)

看起来你是按字符串文字排序的。 'myfield'周围的单引号有什么用?使用字符串文字,将为返回的每个行分配相同的确切值。 MySQL可以按照它选择的任何顺序返回行。没有任何违反ORDER BY'字符串文字'的顺序。如果优化器只丢弃无意义的ORDER BY子句,我不会感到惊讶。

在MySQL中,标识符可以通过将它们包含在反引号中来进行转义。在我的键盘上,这是左上角的`〜键,就在 1的左边! key。

单引号括起字符串文字

(...绕过sql_mode中双引号和ANSI_QUOTES的讨论......)

此查询返回什么内容?

SELECT 'myfield' FROM mytable LIMIT 50 ;

在我的系统上,我得到50个相同字符串的副本。如果我将表名括在单引号中,则会出现语法错误。

字符串文字在ORDER BY子句中的工作方式完全相同...每一行都显示相同的字符串值。

您观察到的订购差异可能是由于不同的访问计划。检索一列可能是使用索引,所有列的检索可能是对表的完整扫描。

如果您的查询未使用单引号,请随时发布您正在执行的完全查询。