【发布时间】:2015-03-19 14:51:06
【问题描述】:
我有一个简单的查询
SELECT * FROM table_name order by non_unique_column LIMIT 0,50
这给了我按某种顺序排列的记录列表。
但是当我从表中删除* 并将some column names 放入时,它正在更改列表顺序。
对于some select 子句中的列组合,它给出了不同的顺序。
我找不到,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 `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 子句中的内容。我的问题是对于给定的记录集,无论我选择什么列,它都应该返回相同的有序记录。
【问题讨论】:
-
不应该真的发生,我们可以看看一些示例数据吗?
-
我确定不可能。
-
简单规则 - 如果您想要一致的顺序,您必须使用
ORDER BY子句明确确定每一行的顺序。其他任何内容都只是实现细节,可能随时更改。 -
所有
ORDER BY子句中的唯一列是CON_PREFIX。该列是否足以唯一确定所有行的顺序?不会。因此对于将交付的订单行没有没有保证。您观察不同的订单的事实只是进一步证明没有保证。而获得保证顺序的唯一方法是在ORDER BY子句中添加更多列。 -
这样说 - 根据查询的其他部分,数据库使用技术 A(可能使用一个特定的索引)或技术 B(可能累积结果并使用某种形式的哈希表) - 这些技术可能会产生不同顺序的结果。服务器then 使用您提供给它的关于您想要 的排序顺序的唯一信息,并执行产生该结果所需的最低限度的信息。其他任何东西都是浪费。
标签: mysql select sql-order-by