按升序排列创建一个包含行的新表

时间:2011-12-24 01:09:34

标签: php mysql

我有一个数据库,其表中的行的值“ID”会发生很大变化。 它可能像:

<小时/> row1.ID = 5, row2.ID = 47, row3.ID = -6, 等等
完全随机的顺序。 当我加载一个页面时,我可以创建另一个表,该页面将占用第一个表中的所有行,并创建第二个表,按照“ID”值的顺序排列它们。 所以第二个表是:
row1.ID = -6, row2.ID = 5, row3.ID = 47, 等等
这有意义吗?

3 个答案:

答案 0 :(得分:1)

当然,最简单的答案是在查询表时使用ORDER BY,然后您可以控制查询结果集中的行顺序。但我认为你的意思是,当你不使用ORDER BY时,你希望行的“自然”顺序是数字顺序。

如果您的表使用InnoDB存储引擎,则在不使用ORDER BY进行查询时的默认顺序始终是主键的顺序。这是因为InnoDB通过主键将表存储为聚簇索引。因此,如果ID是您的主键,并且您将表转换为InnoDB,那么您可以依赖其自然顺序。

mysql> ALTER TABLE MyTable ENGINE=InnoDB;

如果您的表存储为MyISAM,则自然顺序是数据文件中物理存储的订单行,这与值的顺序甚至是您创建行的顺序无关。

对于这些表,您可以使用以下命令以主键顺序转储表:

$ mysqldump --order-by-primary databasename tablename > table.sql

然后恢复表格。数据将按主键顺序重新加载。然后,当您不使用ORDER BY进行查询时,默认顺序将是ID。但是,这并不会阻止行在值发生变化时再次出现故障。


重新评论:

最好的选择是使用WHERE。这很有效,因为它可以使用聚集索引很快找到正确的行。

SELECT * FROM MyTable WHERE ID = 6;

效率较低但仍然比返回所有行更好的替代方法是按流在流中的位置而不是按其值来选择一些行或多行。

SELECT * FROM MyTable LIMIT 1 OFFSET 5;

第一个数字是您想要的行数,第二个数字是首先要跳过的行数。

通常,您只想在指定订单后使用LIMIT,否则您可能会以无意义的顺序获取行,而第五行不会比第一行更令人满意。

SELECT * FROM MyTable ORDER BY created_at LIMIT 1 OFFSET 5;

答案 1 :(得分:0)

只需将ORDER BY ID添加到您的select cmd,不要仅为了订购而创建第二个表吗?

答案 2 :(得分:0)

你不能这样做,因为即使你理论上*以正确的顺序保存它们你必须使用ORDER BY运算符以正确的顺序返回它,否则DBMS可能以任何顺序返回它

  

ORDER BY是对结果集中的行进行排序的唯一方法。没有   在这个子句中,关系数据库系统可以返回任何行   订购。 (来自ORDER BY - 维基百科)

所以无论如何你必须使用ORDER BY(如果从我的回答中不清楚 - 这是编辑

*理论方式:

INSERT INTO table2 SELECT * FROM table1 ORDER BY ID 

table1table2应具有相同的架构