我可以得到一个有几列但仍然确定的 ORDER BY 吗?

Can I get an ORDER BY with several columns but still deterministic?

提问人:gus 提问时间:6/13/2023 最后编辑:gus 更新时间:6/13/2023 访问量:87

问:

我知道确定性是当你按列排序时,1)这是真的吗?ORDER BYUNIQUE INDEX

我想按列和 .namepercentage

有可能 2 个或更多学生具有相同的名字和相同的百分比,因此,在这种情况下,这将是不确定的,因为会定义哪个放在第一位,哪个放在后面(不是我),2) 这是真的吗?ORDER BYMySQL

所以,我的第三个问题是(主要问题),如果我想按几列排序,但仍然有一个确定性的顺序,我应该在所有列的末尾使用一列,例如UNIQUE INDEX

ORDER BY name, percentage, id?

考虑到idprimary key

我仍然不知道我是否正确理解了确定性和非确定性

mysql sql-order-by 确定性 非确定性

评论

3赞 Barmar 6/13/2023
是的,如果添加一个唯一的列作为最后一列,您将获得一致的确定性排序。ORDER BY
1赞 Shadow 6/13/2023
您不仅应该将 id 列添加到 order by 子句中,还应该将其添加到选择列表中,否则您甚至无法区分两个同名的学生:)
0赞 gus 6/13/2023
嗨,@Barmar,所以,我的 3 个问题的答案是“是”,即按照我的理解可以吗?
1赞 Bohemian 6/13/2023
稍微扩展一下 Barmar 的评论:您可以按某物订购而无需选择它。
1赞 Bohemian 6/13/2023
@gus 不仅如此,您还可以按任何表达式进行排序

答:

3赞 Barmar 6/13/2023 #1
  1. 不一定。如果结果在列中不包含任何重复项,则顺序将是确定的。ORDER BY
  2. 是的,如果存在重复项,则结果是不确定的。
  3. 是的,向 添加一个唯一的列可以确定它。ORDER BY

这是否重要取决于您的应用程序。 如果您正在执行基于查询的复制,并且使用 .如果没有确定性排序,主副本和副本之间的 ID 可能会不一致。INSERT INTO table SELECT ...AUTO_INCREMENT

评论

0赞 gus 6/13/2023
"这是否重要取决于您的应用程序。- 好的,我需要一个 HTML 视图来显示查询的行(分页器),所以我认为顺序必须是确定性的才能有一致的页面,对吧?@Barmar
1赞 Barmar 6/13/2023
是的。尽管如果在分页时更改表,您仍然会遇到不一致的情况。当您在 Stack Exchange 中翻页“热点问题”页面时,就会发生这种情况。
1赞 Barmar 6/13/2023
是的,这是查看不断变化的数据所固有的。但是有些应用程序以不同的方式进行分页 - 它们会制作一个快照,然后您分页浏览它。在这种情况下,您不必担心查询之间的一致性。
1赞 Barmar 7/2/2023
索引并不真正相关。重要的是结果集中是否存在任何重复项。索引的唯一相关性是,当一列是唯一的时,您知道它不会有任何重复项。但是,当您开始联接表时,如果它们与多行联接,则可以创建唯一列的副本。
1赞 Barmar 7/2/2023
ORDER BY 应包含保证结果中唯一排序的所有列。具体情况取决于实际查询(例如,更改内容)。当涉及联接时,很难给出一个通用的答案。GROUP BY
0赞 mexok 6/13/2023 #2

要回答您的问题,请执行以下操作:

  1. 是的
  2. 是的,但更具体地说:这是mysql用来对导致随机性的数据进行排序的快速排序算法。
  3. 如果你需要一个确定性的查询,那么是的,这是一个很好的方法。