【问题标题】:Order posts by number manually entered by the user按用户手动输入的编号排序帖子
【发布时间】:2015-03-14 06:39:59
【问题描述】:

我有一个网站,其管理员用户登录到限制区域并添加显示在公共区域的内容。管理员希望在帖子插入/编辑表单上有一个简单的输入文本字段,他可以在其中键入一个数字,以确定该帖子将在哪个位置显示给公众。

因此,如果“Foo”帖子的编号为 3,则应将其列在第 3 位,旧帖子 3 应变为 4,4 应变为 5,依此类推。如果帖子 5 重新定位为 1,1 应自动变为 2,2 应变为 3,依此类推。如果管理员重新定位,3 到 2,2 应仅变为 3,无需更改其他位置。如果10变成9,9变成10,也不需要改变其他职位的位置。简而言之,当一个帖子的位置发生变化(或插入现有帖子的中间)时,其余帖子的位置应相应移动。

我考虑了两种可能性:

  • 创建一个疯狂的算法,选择所需的每个帖子并更新position 列;
  • 在表中实现一个链表,以便每个帖子始终知道下一个帖子的主键是什么。

使用第一个选项,当管理员插入或更新帖子的位置时,所有工作都在那一刻完成,当访问公共站点时,SQL 只是在单个查询中选择所有需要的帖子并对其进行排序通过position。我还不知道我将如何实现它,但我确信使用大量代码和可能的糟糕权衡是可能的。

使用第二个选项,在插入/更新期间完成的工作要少得多,但是当用户访问该站点时,我需要为每个帖子做一个选择,以便使用每个帖子的链接来实现正确的定位下一个“节点”。因此,如果我在给定类别中有 150 个帖子,我将不得不运行 150 个选择(对于当前“节点”指向的每个帖子一个选择。在这种情况下不会使用分页,只有标题会真正列出来,一个在另一个之下,所以,我将它们全部列出。

我想就我所描述的两种可能性提出其他方法、见解或改进建议。

解决方案

我接受了@FractlizeR 的回答,因为它使用了一些其他成熟的软件来支持他的选择。

wrote a small prototype on the solution I ended up using at work。当然,我在工作中使用的代码是不同的,因为我正在更改遗留系统。尽管如此,我还是使用了与原型中完全相同的 SQL 方法。我希望我能尽快改进那个原型,特别是它的 cmets,但至少它在那里,以防我或其他人需要做类似的事情。

【问题讨论】:

  • 如何使用浮动来指示帖子的位置?这样,您可以在其他两个帖子之间移动帖子,并且仍然可以使用简单的 select 语句。例如,如果一个帖子被移动到第三个位置(2 到 3 之间),你只需给它 2.5 的位置。
  • @Faris 这将变成复杂的逻辑,以在不断重新排序同一项目时尽量不耗尽浮点数的精度;)
  • 只是为了让大家了解情况,我不得不在工作中切换到不同的任务,并且将在两三天内回到这个问题。到时候我会考虑大家的建议。感谢到目前为止所有帮助过的人。顺便说一句,here's a post that made me consider a linked list.

标签: algorithm sorting


【解决方案1】:

我会投票给#1。例如,XenForo 论坛引擎就是这样做的。它使用帖子position 进行分页和其他事情。当它需要在线程中插入新帖子时,它会在线程中查询所有需要重新排序的帖子,然后为每个帖子计算一个新位置,然后更新所有帖子的表,其中位置发生了变化。

我们在生产中使用 XenForo 很长时间了,实际上应该没有问题,因为这个操作(重新排序)并不那么复杂。

【讨论】:

  • 您的意思是在开头或中间插入帖子?另外,改变帖子的位置怎么样?
  • @Fernando 我的意思是任何插入。将新帖子附加到线程的末尾不涉及重新计算。您只需要获取 post_count 并将其 +1 即可获得新帖子的位置。
猜你喜欢
  • 2014-04-10
  • 2017-06-29
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
相关资源
最近更新 更多