【发布时间】:2019-07-24 21:22:17
【问题描述】:
如何从表中对值进行排序,从插入的时间开始按升序排列。对于这个问题没有特殊的列,比如时间戳或自动增量。
我知道不建议这样做……但我还是想知道该怎么做。
据我从答案中了解到,如果在插入值之前没有添加排序列,例如时间戳或自动增量,则无法通过插入对它们进行排序。
【问题讨论】:
标签: mysql
如何从表中对值进行排序,从插入的时间开始按升序排列。对于这个问题没有特殊的列,比如时间戳或自动增量。
我知道不建议这样做……但我还是想知道该怎么做。
据我从答案中了解到,如果在插入值之前没有添加排序列,例如时间戳或自动增量,则无法通过插入对它们进行排序。
【问题讨论】:
标签: mysql
如果查询中没有ORDER BY 子句,则无法保证以任何特定顺序返回行。
考虑一个返回表中所有行的所有列的简单查询。例如:
SELECT * FROM mytable ;
对于该查询,MySQL 很可能会从表的开头执行全表扫描。因此,这些行很可能会按照它们在物理存储中的顺序返回。
这可能大致对应于插入行的顺序,如果没有删除、没有更新和没有重组,则插入行的空间稍后会被回收,并重新用于存储新插入的行。
但不能保证这种行为。
要按插入顺序返回行,查询必须通过包含ORDER BY 子句来指定要返回的行的顺序。
对于以“插入顺序”返回的行,这意味着查询需要能够获得该信息,或者能够推导出该信息。对于针对单个表的简单查询,这意味着信息需要存储在行中。
【讨论】:
ORDER BY 子句中指定的顺序除外。如果我们需要按照插入的顺序返回行,我们需要为每一行提供可用的信息。这通常存储在行本身中,但在边缘情况下,它可以存储在另一个表中,可以为每一行派生它。
prod_id),我在表中没有任何 date 列。所以只是ORDER BY prod_id DESC) 有效,它按插入的降序返回.. 是否可靠.. ?
prod_id 列。 (OP 没有 auto_increment 列。)您查询的ORDER BY 子句保证返回指定序列中的行。这是可靠的,是的。 (自动分配了prod_id 的行将具有比先前插入的行“更高”的值。但是数据库将不(必然)阻止行上prod_id 的值被UPDATE 语句。也不会阻止 INSERT 语句为prod_id 提供低于最大值的值。)
你可以ORDER BY 一些你可以从你的桌子上拿下来的东西。如果你没有任何东西可以用来找出你需要的订单,你不能通过它来订购。
【讨论】:
根据表中的数据,您可以按数据的 id 排序 - 如果数据具有单个增量整数以确保 PK 唯一性。除非数据被捕获并记录在表中,否则没有其他方法可以按插入顺序排序。
我不知道 MySQL 中有什么东西会保留您未在表级别指定的记录的额外(元)信息。
【讨论】:
需要有一个列来对您的查询进行排序。通常这将是一个插入时间戳,或递增 id/递增键。否则无法保证订单,因为没有记录。
【讨论】:
Generally, you should not rely on the order of rows returned by the DB when you have not specified any order 我不确定。