我有一个MySQL表,其中的行需要按照用户决定的特定顺序进行排序。换句话说,需要用户能够在表中的随机点插入新行,并且还将现有行移动到选择查询的表输出中的新随机位置/行号...
到目前为止我想到的解决方案:
我可以使用带有ORDER BY的整数,但是,我需要在“插入”之后更新每一行。
我可以使用时间戳和索引整数,将新行的索引整数设置为等于当前占用插入点的行的索引整数,然后在查询的第一个顺序中按索引,然后按时间戳,但当我想将旧行移动到新索引而不是插入新索引时,仍会出现“全部更新”问题。
答案 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这样的电子表格,在许多情况下会将存储和演示联系在一起。)