Mysql表使用相同的ORDERBY子句进行不同的排序
我注意到以下问题Mysql表使用相同的ORDERBY子句进行不同的排序,mysql,sql-order-by,Mysql,Sql Order By,我注意到以下问题 SELECT * FROM 'mytable' ORDER BY 'myfield' 生成一个顺序非常不同的表 SELECT id FROM 'mytable' ORDER BY 'myfield' 我排序所依据的字段是日期字段,对于50%的记录,该值为空。另外,如果在我的SELECT子句中,我命名了每个字段而不是依赖*它实现了与上面第二个查询相同的顺序 有人能告诉我为什么会发生这种情况,以及我能做些什么来获得一致的排序吗?没有第二级排序,空记录将以引擎希望的任何顺序出现。
SELECT * FROM 'mytable' ORDER BY 'myfield'
生成一个顺序非常不同的表
SELECT id FROM 'mytable' ORDER BY 'myfield'
我排序所依据的字段是日期字段,对于50%的记录,该值为空。另外,如果在我的SELECT子句中,我命名了每个字段而不是依赖*它实现了与上面第二个查询相同的顺序
有人能告诉我为什么会发生这种情况,以及我能做些什么来获得一致的排序吗?没有第二级排序,空记录将以引擎希望的任何顺序出现。。。可能是ID上索引的顺序,或者是包含日期的复合索引。如果希望按日期字段执行一致的排序顺序,则表的主键。如果不存在主键,则需要按所有列排序,这将使记录唯一 所以 vs
将产生相同的顺序。看起来您是按字符串文字排序的。“myfield”周围的单引号是怎么回事?对于字符串文字,将为返回的每一行指定相同的精确值。MySQL可以按照它选择的任何顺序返回行。没有任何顺序会违反“字符串文字”的顺序。如果优化器只是丢弃了一个毫无意义的ORDERBY子句,我不会感到惊讶
在MySQL中,标识符可以通过将其包含在反标记中来转义。在我的键盘上,那是左上角的`~键,就在1的左边!钥匙 单引号将字符串文字括起来 (…绕过sql_模式中双引号和ANSI_引号的讨论…)
这个查询返回什么
SELECT 'myfield' FROM mytable LIMIT 50 ;
在我的系统上,我得到50个相同字符串的副本。如果将表名括在单引号中,则会出现语法错误
字符串文字在ORDERBY子句中的工作方式完全相同。。。每行上都显示相同的字符串值
您观察到的排序差异可能是由于不同的访问计划造成的。一列的检索可能使用索引,所有列的检索可能是对表的完整扫描
如果您的查询不使用单引号,请随意发布您正在执行的确切查询。按两个字符串文字排序不会有太大区别。@spencer7593是的,我同意,但myfield和pk是实际字段名的“占位符”,而不是文字。因此,MyField、PK和MyTable,因为如果我的表是勾号格式的,则其语法无效。如果标识符确实包含单引号,则可以通过将其包含在反勾号中来转义
SELECT id FROM`'mytable``orderby`'myfield``,`'PK`
。我已经将主键添加到orderby子句中,现在返回相同的结果。然而,我第一次发布的每个查询在每次执行时都会以完全相同的顺序返回结果,只是彼此的顺序不同。非常奇怪。在这两种情况下,您使用的是同一个表,订单相同,但行顺序不同。。。。我只是不明白这怎么可能。您可以创建一个显示此行为的应用程序吗?这是
SELECT * FROM `mytable` ORDER BY `myfield`, `PK`
SELECT 'myfield' FROM mytable LIMIT 50 ;