【问题标题】:MySQL, ORDER BY insertion order, no sorting columnsMySQL,ORDER BY 插入顺序,无排序列
【发布时间】:2019-07-24 21:22:17
【问题描述】:

如何从表中对值进行排序,从插入的时间开始按升序排列。对于这个问题没有特殊的列,比如时间戳或自动增量。

我知道不建议这样做……但我还是想知道该怎么做。

据我从答案中了解到,如果在插入值之前没有添加排序列,例如时间戳或自动增量,则无法通过插入对它们进行排序。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    如果查询中没有ORDER BY 子句,则无法保证以任何特定顺序返回行。

    考虑一个返回表中所有行的所有列的简单查询。例如:

    SELECT * FROM mytable ; 
    

    对于该查询,MySQL 很可能会从表的开头执行全表扫描。因此,这些行很可能会按照它们在物理存储中的顺序返回。

    这可能大致对应于插入行的顺序,如果没有删除、没有更新和没有重组,则插入行的空间稍后会被回收,并重新用于存储新插入的行。

    但不能保证这种行为。

    要按插入顺序返回行,查询必须通过包含ORDER BY 子句来指定要返回的行的顺序。

    对于以“插入顺序”返回的行,这意味着查询需要能够获得该信息,或者能够推导出该信息。对于针对单个表的简单查询,这意味着信息需要存储在行中。

    【讨论】:

    • 好答案。是的,这种行为是不能保证的,我可以知道,因为它们在插入时没有相应地排序。
    • 但是在插入行时按降序对行进行排序
    • @Bhavesh Gangani:是的,可以按特定顺序插入行。但这不保证 SELECT 语句将按照插入行的顺序或任何特定顺序返回行,ORDER BY 子句中指定的顺序除外。如果我们需要按照插入的顺序返回行,我们需要为每一行提供可用的信息。这通常存储在行本身中,但在边缘情况下,它可以存储在另一个表中,可以为每一行派生它。
    • 我正在为应用程序级别的行生成唯一 ID 作为主键(列名:prod_id),我在表中没有任何 date 列。所以只是ORDER BY prod_id DESC) 有效,它按插入的降序返回.. 是否可靠.. ?
    • @Bhavesh:在这种情况下,您实际上有一个 auto_increment prod_id 列。 (OP 没有 auto_increment 列。)您查询的ORDER BY 子句保证返回指定序列中的行。这是可靠的,是的。 (自动分配了prod_id 的行将具有比先前插入的行“更高”的值。但是数据库将不(必然)阻止行上prod_id 的值被UPDATE 语句。也不会阻止 INSERT 语句为prod_id 提供低于最大值的值。)
    【解决方案2】:

    你可以ORDER BY 一些你可以从你的桌子上拿下来的东西。如果你没有任何东西可以用来找出你需要的订单,你不能通过它来订购。

    【讨论】:

    • 好吧,现在添加一个我知道是错误的答案会很奇怪,不是吗?您接受的答案基本相同,但不知何故似乎暗示您可以做其他事情,而您确实不能。如果你不能订购,你就不能订购。其余的真的不值得一提..
    【解决方案3】:

    根据表中的数据,您可以按数据的 id 排序 - 如果数据具有单个增量整数以确保 PK 唯一性。除非数据被捕获并记录在表中,否则没有其他方法可以按插入顺序排序。

    我不知道 MySQL 中有什么东西会保留您未在表级别指定的记录的额外(元)信息。

    【讨论】:

      【解决方案4】:

      需要有一个列来对您的查询进行排序。通常这将是一个插入时间戳,或递增 id/递增键。否则无法保证订单,因为没有记录。

      relevant thread from MySQL forum

      【讨论】:

      • 100% 确定 MySQL 没有关于插入时间或任何类似排序的记录?
      • 为什么不直接添加时间戳列呢?是的,100% 肯定。要订购查询,您需要通过 by 订购它。
      • 从 MySQL 论坛上读到:Generally, you should not rely on the order of rows returned by the DB when you have not specified any order 我不确定。
      • 获得你想要的那些行的唯一方法是也给它们 id 或时间戳(但只有在你已经知道它们应该如何排序的情况下才可能)。
      • 您发布的引用可能是指查询通常会以某种方式返回(例如,如果它只是字符串值,它将按字母顺序排列),但没有指定列,你不能确定。这里的问题在于您存储数据的方式,而不是 MySQL。
      猜你喜欢
      • 1970-01-01
      • 2010-10-18
      • 2013-12-22
      • 1970-01-01
      • 2016-11-16
      • 2022-01-24
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      相关资源
      最近更新 更多