改变MySQL表中行的顺序的最佳方法是什么?

时间:2016-10-31 22:41:18

标签: mysql row sql-order-by

我有一个MySQL表,其中的行需要按照用户决定的特定顺序进行排序。换句话说,需要用户能够在表中的随机点插入新行,并且还将现有行移动到选择查询的表输出中的新随机位置/行号...

到目前为止我想到的解决方案:

  1. 我可以使用带有ORDER BY的整数,但是,我需要在“插入”之后更新每一行。

  2. 我可以使用时间戳和索引整数,将新行的索引整数设置为等于当前占用插入点的行的索引整数,然后在查询的第一个顺序中按索引,然后按时间戳,但当我想将旧行移动到新索引而不是插入新索引时,仍会出现“全部更新”问题。

2 个答案:

答案 0 :(得分:1)

一般来说,关系数据库最基本的一点是数据的顺序(存储时)完全不相关。

如果您希望按特定顺序检索数据,select数据,并在order-by子句中指定所需的顺序。

如果要始终指定该顺序,可能需要创建视图,并在视图定义中指定排序(如果在视图上执行select,仍可以覆盖此顺序它指定了自己的order by子句。

如果您确实在所有(或几乎所有)时间以特定顺序检索该表中的所有数据,则可能需要在该订单上创建聚簇索引。这可以(通常)帮助按顺序检索数据。

答案 1 :(得分:1)

@Jerry说的是真的,表中的数据序列并不重要。关联或相关的数据是。

例如,如果您尝试记录某些事件的时间,则需要包含该时间段的列:

item    time
----    ----
one     01:00
two     02:00
four    04:00

如果您在纸上或白板上注意到这一点,也包含演示文稿的媒体,如果您想在03:00包含项目“3”,则会删除最后一行。但是在数据库中,您只需将插入有点用词不当)新数据插入到表的末尾:

item    time
----    ----
one     01:00
two     02:00
four    04:00
three   03:00

数据存储不必是连续的。当您提供数据(用于人类可读性或股东报告)时,您可以根据最适合的演示文稿订购

如果不是编号“项目”而是名字,那该怎么办:

person    time
----      ----
Betty      01:00
Annie      02:00
Charlie    03:00

这里的行按时间“按顺序”排列,但不按名称按字母顺序排列。如果报告要求您按名称订购数据怎么办?

SELECT name, time
FROM mytable
ORDER BY name ASC;

<强>输出:

Annie      02:00
Betty      01:00
Charlie    03:00

如果您需要随机订单:

SELECT name, time
FROM mytable
ORDER BY RAND();

希望这些额外的信息有用,因为我认为数据的存储演示文稿是您可能会联系在一起的两个概念。

(例如,像Excel这样的电子表格,在许多情况下会将存储和演示联系在一起。)