mysql如何对具有相同值的行进行排序

时间:2011-07-12 10:35:21

标签: mysql sql-order-by

在我的数据库中,我有一些记录,我按照恰好相同的值进行排序:

| col1 | timestamp              |
| row1 | 2011-07-01 00:00:00    |
| row2 | 2011-07-01 00:00:00    |
| row3 | 2011-07-01 00:00:00    |

SELECT ... ORDER BY timestamp

看起来结果是随机顺序。 随机顺序是否一致。这意味着如果我在两个mysql服务器中拥有这些数据。我可以期待相同的结果吗?

5 个答案:

答案 0 :(得分:10)

我建议不要做出这个假设。在标准SQL中,显式ORDER BY子句不需要的任何内容都取决于实现。

我不能代表MySQL,但在例如SQL Server,到ORDER BY所涉及的“相等”行的输出顺序可能会在每次运行查询时发生变化 - 并且几乎可能受到任何影响(例如服务器的补丁/服务包级别) ,工作负载,哪些页面当前在缓冲池中等。)

因此,如果您需要特定订单,那么您可以做的最好的事情(保证它,并为将来的维护者记录您的查询)明确请求您想要的订单。

答案 1 :(得分:6)

已有很多答案,但底线答案是

如果您希望以特定顺序返回一致的行,请在ORDER BY中指定。没有它,绝对没有保证将返回的订单行。

我认为您可能缺少的是ORDER BY子句中可以列出多个表达式。并且您可以包含不在SELECT列表中的表达式。

例如,在您的情况下,您可以使用ORDER BY timestamp, id

(或其他一些列或表达。)

这将在时间戳上首先排序行,然后任何具有相同时间戳值的行将按id排序,或者列表中的下一个表达式。

答案 2 :(得分:2)

这取决于使用的存储引擎。在MyISAM中,它们将按自然顺序排序(即,它们存储在磁盘上 - 可以使用ALTER TABLE ... ORDER BY命令进行更改)。在InnoDB中,它们将由PK订购。其他引擎可以有自己的规则。

答案 3 :(得分:2)

在ORDER BY条件中,如果行是相同的值,或者如果要通过选择ORDER BY语句来排列数据。 CASE:你想ORDER BY列的值是单词的频率。并且表中的两个单词在频率出现列中可能具有相同的频率值。因此在频率列中,您将具有两个相同频率的两个不同单词。因此,在“select * from database_name ORDER BY frequency”中,您可以找到具有相同频率的两个单词中的任何一个在其后者之前出现。并且在第二次运行中,在现在出现的第一个单词之后显示的另一个单词。这取决于缓冲存储器,此时页面进出等等。

答案 4 :(得分:1)

答案是:不,订单不会保持一致。我遇到了同样的问题,并通过在订单部分添加另一列来解决。请确保此列对于每个记录都是唯一的,例如ID' ID'或者其他什么。

在这种情况下,您必须添加ID' ID'表格中的字段,对于每条记录都是唯一的。你可以指定它' AI' (自动增量)这样你就不会处理维护了。

添加' ID'列,更新查询的最后部分,如:

SELECT mt.*
FROM my_table mt
ORDER BY mt.timestamp ASC, mt.id DESC