order by子句如何在mysql中工作,排序显示奇怪的行为

时间:2015-01-21 06:52:46

标签: mysql select sql-order-by

我有一个简单的查询

SELECT * FROM table_name order by non_unique_column LIMIT 0,50

这给了我一些顺序的记录列表。

但是,当我从表中移除*并放置some column names时,它正在更改列表顺序。

对于select子句中的some列组合,它给出了不同的顺序。

我无法找到,select子句中列名的模式给出了不同的顺序。

所以我问有没有人有这种问题?或者任何人都可以建议在这种情况下order by子句如何工作?

注意:如果我在select子句中添加所有列,它会给我与*相同的结果。

请随时提出任何可能的建议。

感谢。

更新:当我将LIMIT 0,50等限制条款更改为LIMIT 0,15时,我会收到不同的记录集。

UPDATE2:

我创建了一个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

感谢。

个人意见: 我认为这是一个错误/缺陷,因为即使我没有定义任何唯一的order by子句,mysql也会根据它使用一些随机排序计算,我觉得它不应该取决于select子句中的内容。我的问题是对于一组给定的记录,无论我选择哪一列,都应该返回相同的有序记录。

2 个答案:

答案 0 :(得分:1)

这个问题是因为您为订​​单指定了重复的价值,也就是其先生或夫人。由于他们都是先生或夫人,因此没有保证选择订单。

如果你想确保它总是按照特定的顺序排列,那么你还应该将主键作为第二个排序包含在内以保持一致...又名

ORDER BY CON_PREFIX ASC, M_ID ASC

因为它现在正好ORDER BY CON_PREFIX正在给你它应该给你的东西,前缀按升序排列,没有任何与引起这个的限制有关,你只是没有告诉MySQL你怎么了希望将数据返回给您。


回复您在问题中的PERSONAL OPINION修改内容.... 你所描述的是不合理的,想到这一点,任何用于提取数据的默认订单现在都已消失,因为你正在指定一个订单。如果该条款没有任何顺序,那么mysql有一个通用的选择模式,但是一旦你在查询上下订单就会消失

答案 1 :(得分:-1)

order by子句从左到右工作 让我举个例子

如果你使用 SELECT serialNo,Name FROM table_name order by serialNo,Name;

这样做它会在第一个实例中命令serialNo然后它会在第二个实例中命令Name。当它在第二个实例中命令名称时,serialNo的编号将根据名称的顺序而改变。

希望我的解释清楚。