我有一个MySQL表,表中的行需要按照用户决定的特定顺序进行排序,换句话说,需要用户能够在表中的随机点插入新行,并将现有行移动到选择查询的表输出中的新随机位置/行号......
到目前为止我想到的解决方案:
1.我可以使用一个整数和一个ORDER BY,但是,我需要更新“插入”点之后的每一行。
1.我可以使用时间戳和索引整数,将新行的索引整数设置为等于当前占用插入点的行的索引整数,然后在查询中首先按索引顺序,然后按时间戳顺序,但是当我想将旧行移动到新索引时,“更新所有”问题仍然发生,而不是插入新行。
3条答案
按热度按时间nue99wik1#
一般来说,关系数据库最基本的一点是数据的顺序(存储)完全无关紧要。
如果希望按特定顺序检索数据,则
select
数据,并在order-by子句中指定所需的顺序。如果你想一直指定这个顺序,你可能想创建一个视图,并在视图的定义中指定一个顺序(如果你在指定了自己的
order by
子句的视图上执行select
,这仍然可以被覆盖)。如果你真的总是(或几乎总是)以特定的顺序从该表中检索所有数据,你可能想按该顺序创建一个聚集索引。这可以/将(通常)帮助按该顺序检索数据。
rt4zxlrg2#
@Jerry说的是真的,表中数据的顺序并不重要,重要的是关联或相关的数据。
例如,如果您试图记录某些事件的时间,则需要包含该时间的列:
如果您在纸上或白板上或其他东西上记录了这一点,那么如果您想在03:00包含项目“三”,您可以删除最后一行。但是在数据库中,您可以简单地将 (insert有点用词不当) 新数据插入到表的末尾:
数据的存储不需要是顺序的,当你展示数据时(为了可读性或者股东报告),你可以根据最适合展示的方式来排序。
如果不是编号的“项目”,你有名字:
这里的行是按时间“排序”的,而不是按名称的字母顺序。
输出:
如果您需要随机排序:
希望这些额外的信息有所帮助,因为我认为数据的 * 存储 * 和 * 表示 * 是您可能联系在一起的两个概念。
(例如,像Excel这样的电子表格在许多情况下将存储和表示结合在一起。
ttp71kqs3#
你有没有想出一个更优雅的选择?我在同一条船上,我真的很困惑,为什么这不是一个更受欢迎的主题。
虽然我认为底线是 * 除了将“用户订单”存储在自己的数据库字段中之外,没有其他选择 *。
我的列表同步流程:
1.插入列表
1.将项目添加到本地列表
1.抓取整个有序本地列表
1.插入/更新所有项目,即
INSERT [...] ON EXISTING UPDATE [...]
。这是可以的,因为本地行数小于或等于数据库行数。1.重新排序
1.与上面的过程和推理相同。
1.删除列表
1.在本地删除项
1.从数据库中删除项目(this is key,因为它可以防止列表中有相同顺序的多余项目-或者,您可以删除列表中的所有项目,虽然它不太容易出错,但它看起来很愚蠢和过分)
1.(同上)抓取整个有序的本地列表
1.(同上)插入/更新所有项目,即
INSERT [...] ON EXISTING UPDATE [...]
。这是可以的,因为在删除之后,本地行数小于或等于数据库行数这个过程仍然让人感觉很奇怪,尤其是当只添加、删除或修改一个项目(更改顺序)时更新整个列表的想法。
旁注:我愚蠢地遇到了一个问题,因为在一个特定的情况下,我删除了本地项,然后简单地更新了数据库中的行。起初,逻辑上是有意义的,但现实是,我们没有更新数据库中的所有行,只是那些在本地和数据库中重叠的行,留下了数据库里的另一个(我在本地删除的那个)。所以我的db表有比“order”列暗示的更多的项,因此与本地不同步。更糟糕的是,我在本地使用“user order”作为Dictionary索引,因此,当我从数据库中检索所有项目时,我用具有相同顺序的项目覆盖了项目(由于没有显式删除数据库中的项目而导致),这使得情况更加混乱。