order by 子句如何在 mysql 中工作,排序显示奇怪的行为
How order by clause works in mysql, ordering shows wierd behaviour
我有一个简单的查询
SELECT * FROM table_name order by non_unique_column LIMIT 0,50
这给了我一些顺序的记录列表。
但是当我从 table 中删除 *
并放入 some column names
时,它正在更改列表顺序。
对于 select 子句中的 some
列组合,它给出了不同的顺序。
我无法找到 select 子句中的列名模式给出了不同的排序。
所以我想问一下有没有人遇到过这种问题?或者有人可以建议 order by 子句在这种情况下的工作原理吗?
注意: 如果我在 select 子句中添加所有列,它会得到与 *.
相同的结果
请随时提出任何可能的建议。
谢谢。
更新: 另外,当我将 LIMIT 0,50
之类的限制子句更改为 LIMIT 0,15
时,我得到了不同的记录集。
更新2:
我创建了一个 sqlfiddle:
http://sqlfiddle.com/#!2/8f2340/3
请查看以下查询的结果
SELECT `M_ID`, `CON_FRST_NM`, `CON_PREFIX`, `CON_LST_NM`, `CON_MOB`,`CON_FAX` FROM `sample_table` order by `CON_PREFIX` LIMIT 0,60
SELECT `M_ID`, `CON_FRST_NM`, `CON_PREFIX`, `CON_LST_NM`, `CON_MOB` FROM `sample_table` order by `CON_PREFIX` LIMIT 0,60
查询中的唯一区别是 CON_FAX
不存在于第二个查询的 select 子句中。
请帮我看看为什么会出现这种差异。
另请参阅以下使用不同限制子句的查询结果。
注意:这是上述查询中的第二个查询。
SELECT `M_ID`, `CON_FRST_NM`, `CON_PREFIX`, `CON_LST_NM`, `CON_MOB` FROM `sample_table` order by `CON_PREFIX` LIMIT 0,60
SELECT `M_ID`, `CON_FRST_NM`, `CON_PREFIX`, `CON_LST_NM`, `CON_MOB` FROM `sample_table` order by `CON_PREFIX` LIMIT 0,15
谢谢。
个人意见: 我认为这是 bug/defect,因为即使我没有定义任何唯一的 order by 子句和 mysql 正在根据其计算应用一些随机排序,我认为它不应该取决于 select 子句中存在的内容。我的问题是对于一组给定的记录,无论我在 selecting.
的哪个列,它都应该 return 相同的有序记录
order by 子句从左到右工作
我举个例子
如果你使用
SELECT serialNo,Name FROM table_name order by serialNo,Name;
这是做什么的 它会在第一个实例中订购 serialNo,然后在第二个实例中订购 Name。当它在第二个实例中订购 name 时,serialNo 的顺序将根据 name 的顺序而改变。
希望我的解释清楚。
这个问题是因为您为您的订单指定了一个重复的值,也就是它的先生或太太没有保证 select 订单,因为他们都是先生或女士夫人
如果您想确保它始终按特定顺序排列,那么您还应该将主键作为第二个顺序包括在内,以保持它完全相同.. 又名
ORDER BY CON_PREFIX ASC, M_ID ASC
就目前而言,ORDER BY CON_PREFIX
给了你它应该给你的东西,前缀按升序排列,与导致这个的限制没有任何关系,你只是没有告诉 MySQL 您还希望如何将数据返回给您。
回复您在问题中的 PERSONAL OPINION
编辑....
您所描述的是不合理的,以这种方式考虑,用于提取数据的任何默认顺序现在都消失了,因为您正在指定顺序。如果子句上没有任何 order by,那么 mysql 有一个通用的 select 模式,但是一旦你在查询
上放置一个 order by,它又消失了
我有一个简单的查询
SELECT * FROM table_name order by non_unique_column LIMIT 0,50
这给了我一些顺序的记录列表。
但是当我从 table 中删除 *
并放入 some column names
时,它正在更改列表顺序。
对于 select 子句中的 some
列组合,它给出了不同的顺序。
我无法找到 select 子句中的列名模式给出了不同的排序。
所以我想问一下有没有人遇到过这种问题?或者有人可以建议 order by 子句在这种情况下的工作原理吗?
注意: 如果我在 select 子句中添加所有列,它会得到与 *.
相同的结果请随时提出任何可能的建议。
谢谢。
更新: 另外,当我将 LIMIT 0,50
之类的限制子句更改为 LIMIT 0,15
时,我得到了不同的记录集。
更新2:
我创建了一个 sqlfiddle:
http://sqlfiddle.com/#!2/8f2340/3
请查看以下查询的结果
SELECT `M_ID`, `CON_FRST_NM`, `CON_PREFIX`, `CON_LST_NM`, `CON_MOB`,`CON_FAX` FROM `sample_table` order by `CON_PREFIX` LIMIT 0,60
SELECT `M_ID`, `CON_FRST_NM`, `CON_PREFIX`, `CON_LST_NM`, `CON_MOB` FROM `sample_table` order by `CON_PREFIX` LIMIT 0,60
查询中的唯一区别是 CON_FAX
不存在于第二个查询的 select 子句中。
请帮我看看为什么会出现这种差异。
另请参阅以下使用不同限制子句的查询结果。 注意:这是上述查询中的第二个查询。
SELECT `M_ID`, `CON_FRST_NM`, `CON_PREFIX`, `CON_LST_NM`, `CON_MOB` FROM `sample_table` order by `CON_PREFIX` LIMIT 0,60
SELECT `M_ID`, `CON_FRST_NM`, `CON_PREFIX`, `CON_LST_NM`, `CON_MOB` FROM `sample_table` order by `CON_PREFIX` LIMIT 0,15
谢谢。
个人意见: 我认为这是 bug/defect,因为即使我没有定义任何唯一的 order by 子句和 mysql 正在根据其计算应用一些随机排序,我认为它不应该取决于 select 子句中存在的内容。我的问题是对于一组给定的记录,无论我在 selecting.
的哪个列,它都应该 return 相同的有序记录order by 子句从左到右工作
我举个例子
如果你使用 SELECT serialNo,Name FROM table_name order by serialNo,Name;
这是做什么的 它会在第一个实例中订购 serialNo,然后在第二个实例中订购 Name。当它在第二个实例中订购 name 时,serialNo 的顺序将根据 name 的顺序而改变。
希望我的解释清楚。
这个问题是因为您为您的订单指定了一个重复的值,也就是它的先生或太太没有保证 select 订单,因为他们都是先生或女士夫人
如果您想确保它始终按特定顺序排列,那么您还应该将主键作为第二个顺序包括在内,以保持它完全相同.. 又名
ORDER BY CON_PREFIX ASC, M_ID ASC
就目前而言,ORDER BY CON_PREFIX
给了你它应该给你的东西,前缀按升序排列,与导致这个的限制没有任何关系,你只是没有告诉 MySQL 您还希望如何将数据返回给您。
回复您在问题中的 PERSONAL OPINION
编辑....
您所描述的是不合理的,以这种方式考虑,用于提取数据的任何默认顺序现在都消失了,因为您正在指定顺序。如果子句上没有任何 order by,那么 mysql 有一个通用的 select 模式,但是一旦你在查询