ORDERBY子句在mysql中的工作原理,排序显示了wierd行为

ORDERBY子句在mysql中的工作原理,排序显示了wierd行为,mysql,select,sql-order-by,Mysql,Select,Sql Order By,我有一个简单的问题 SELECT * FROM table_name order by non_unique_column LIMIT 0,50 这给了我一些顺序的记录列表 但是当我从表中删除*并放置一些列名时,它就改变了列表顺序 对于select子句中的某些列组合,它给出了不同的顺序 我找不到,select子句中的列名模式给出了不同的顺序 我想问的是,有没有人有这种问题?或者,任何人都可以建议ORDERBY子句在这种情况下如何工作 注意:如果我在select子句中添加所有列,它将给出与*相同

我有一个简单的问题

SELECT * FROM table_name order by non_unique_column LIMIT 0,50
这给了我一些顺序的记录列表

但是当我从表中删除
*
并放置
一些列名时,它就改变了列表顺序

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

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

我想问的是,有没有人有这种问题?或者,任何人都可以建议ORDERBY子句在这种情况下如何工作

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

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

谢谢

更新:同样,当我将限制子句(如
limit 0,50
更改为
limit 0,15
时,我会得到不同的记录集

更新2:

我创建了一个sqlfiddle:

请查看以下查询的结果

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 
查询中唯一的区别是第二个查询的select子句中不存在
CON\u FAX

请帮我解释为什么会出现这种差异

另外,请查看以下查询结果,其中包含不同的限制条款。 注意:这是上述查询中的第二个查询

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
谢谢


个人观点:我认为这是一个错误/缺陷,因为即使我没有定义任何唯一的ORDERBY子句,而且mysql根据其计算应用了一些随机排序,我觉得它不应该依赖于select子句中存在的内容。我的问题是,对于给定的一组记录,无论我选择哪一列,它都应该返回相同的有序记录。

order by子句从左到右运行
让我举个例子

如果你使用 按序号、名称从表\u名称顺序中选择序号、名称

它将在第一个实例中排序serialNo,然后在第二个实例中排序Name。当它在第二个实例中对名称进行排序时,序列号的顺序将根据名称的顺序而改变


希望我的解释清楚

这个问题是因为您为订单指定了一个重复的值,即Mr.或Mrs.没有保证选择订单,因为他们都是Mr.或Mrs

如果您想确保它总是以特定的顺序出现,那么您还应该将主键作为第二个顺序包含进来,以使其保持不变。。阿卡

ORDER BY CON_PREFIX ASC, M_ID ASC
就目前情况而言,
ORDER BY CON_PREFIX
提供的正是它应该提供给您的,前缀按升序排列,这与造成这种情况的限制无关,您只是没有告诉MySQL您希望如何将数据返回给您


要回答您的
个人意见
请在问题中编辑。。。。
您所描述的是不合理的,请这样想,任何用于提取数据的默认顺序现在都不存在了,因为您正在按指定顺序。如果在子句上没有任何order by,那么mysql有一个通用的select模式,但是一旦在查询上放置order by,这种模式就不复存在了

,我们能看到一些示例数据吗?我肯定不能。简单的规则-如果您想要一致的顺序,您必须使用一个
orderby
子句来明确地确定每一行的顺序。其他任何内容都只是实施细节,可能随时会发生更改。所有
ORDER BY
子句中唯一的一列是
CON_PREFIX
。该列是否足以唯一确定所有行的顺序?否。因此,无法保证将以何种方式交付订单行。事实上,你观察不同的顺序只是进一步证明没有保证。获得有保证的顺序的唯一方法是通过
子句向order添加更多列。这样说-根据查询的其他部分,数据库使用技术a(可能使用一个特定索引)或技术B获得结果可能更有效(可能会累积结果并使用某种形式的哈希表)-这些技术可能会以不同的顺序生成结果。然后,服务器使用您提供给它的关于您想要的排序顺序的唯一信息,并执行生成该结果所需的最小值。其他任何操作都将是浪费。不正确,如果您指定要排序的特定列,则不会有额外的排序,从而ld导致原始答案出现偏差请澄清投票否决我的答案。@JohnRuddell那么你认为我的查询将如何工作?我的查询将根据什么进行排序?这取决于你在order by中指定的列。.OP说的非唯一列,让我们假设这是你查询中的
Name
,然后是ORDER BY
Name
将以升序方式返回名称按字母顺序排列的所有行,因为这是默认值。现在,通过编辑,我可以看出您确实错过了问题的要点。该问题仅在一列(不超过一列)上按顺序排列。感谢您的回答,您还可以查看我所做的与限制相关的查询吗。你不明白我在回答中说了什么吗?我明白你的意思。因为我已经将CON_前缀定义为我的非唯一顺序,所以我的sql给出了一些随机顺序,这是
可接受的行为
。现在如果我将select子句从只选择单个列或所有列更改为只选择该列,它应该给我该顺序d记录,而不管我的select子句是什么。@NamanGala您不能保证它在相同的列中是相同的……如果您多次运行select,它可能会不同,或者mysql可能在内存中使用相同的select返回结果,但事实是