如何让用户在列表中的任何位置插入?

时间:2012-08-30 22:04:52

标签: php mysql algorithm sorting

我有一个存储在数据库中的项目列表。每个项目都有一个id列,一个标题和一个位置列(int)。

默认情况下,只要用户向列表中添加新项目,其ID就会被置于该位置。因此,如果您有3个项目,ID为1,2,3,那么它们的位置也将是1,2,3。

然后在获取位置时,我将在SQL查询中执行ORDER BY position ASC

问题是,用户想要一个功能,他可以在现有项目的任何位置添加新项目。

因此,如果您有第1,2,3项位置1,2,3,他可以选择在第2位添加新项目,这将产生第1,2,3,4项,具有位置:1 3 4 2

因此项目#4将被放置在位置2,项目#2和3将被下推到位置3和4等。

完成此插入的最简单/最有效的算法是什么?

1 个答案:

答案 0 :(得分:3)

从代码角度来看,最简单的方法是使用链表样式,其中您有下一个元素ID,而不是订单值。这在小型列表中不太有用,但是当您开始增加列表大小时,它会使更新/移动/删除更加清晰,并防止可能更新数千个元组以进行1次更改。

++我手边没有确切的代码示例,但您可以调用用户的所有列表

SELECT Posts.id, Posts.next, Posts.content, User.firstPost FROM db.posts AS Posts 
JOIN db.user as User ON Posts.ownerid = User.id 
WHERE User.id='123' AND Posts.active = 1;

这将获得单个用户的所有帖子,然后您将拥有一个包含下一篇文章的ID的字段。首先,您需要一个键来标识第一个帖子(将第一个帖子的ID存储在用户的信息中)。在您拉出第一篇文章后,您将获取它的“下一个”值,并使用它来识别下一篇文章。

对于一个简短的列表,这似乎有点疯狂,但想想有1000个帖子的用户。如果他们需要在第二位添加1个帖子。在传统的数字订购系统中,您现在需要使用+1更新来更新999个其他行。使用此解决方案,如果您需要在第二个位置插入帖子,您只需查询第一个帖子以获得它的下一个值。获得后,将其更改为新的第二篇文章的值,并将第二篇文章的下一个值设置为第一篇文章最初持有的值。

[1st Post] --Next---> [2nd Post] --Next---> [3rd Post]

插入后:

[1st Post] -.                          .--> [2nd Post] --Next---> [3rd Post]
            `--Next--> [New 2nd Post]--`