自动更新队列优先级

时间:2012-12-03 19:48:08

标签: mysql

我有这个表决定在我的webportal中显示的文章的顺序: -

Table- ARTICLE_POSITION
`article_id` int(12) NOT NULL,

`article_position` int(11) NOT NULL

说这是表格中的样本数据: -

article_id     article_position
56             1
58             2
443            3
88             4
5667           5
322            6

用于显示相关文章我使用查询根据article_position对它们进行排序并在网页上显示,现在的问题是当我尝试将任何文章移动到不同位置时说我要移动 第5667条从第5位到第1位,我必须使用UPDATE查询更新位于1到5之间的每篇文章的位置

决赛桌结构

article_id     article_position
5667           1*
56             2*
58             3*
443            4*
88             5*  
322            6
  

(*位置更新)

当数据库很大时,这个更新查询变得非常耗时且效率低下,有没有其他方法可以做到....

2 个答案:

答案 0 :(得分:2)

如果您想避免重新排序所有文章,请尝试使用另一种数据类型for article_position而不是int。选择类似时间戳的东西。然后,您的订购查询可以按最新时间戳到最旧时间顺序显示文章。如果您需要将一篇文章移到顶部,只需为其article_position元素指定一个较新的时间戳。这应该解决了必须重新排序原始示例中的所有article_position元素的问题。

答案 1 :(得分:2)

我假设您正在寻找在article_position订单中的任何位置插入的解决方案。我想不出一个解决方案,你永远不必为所有article_id更新article_position,但你可以抵消每次article_position更改时都需要这样做的工作。而不是将每个article_position递增1,添加一些填充以通过增加的位置增量(5,10,25,100等等)插入。这将为更改现有文章的article_position留出空间,而无需更新所有其他文章。

使用您的示例进行演示:

article_id     article_position
56             5
58             10
443            15
88             20
5667           25
322            30

重新订购后(* =更新的article_position)

article_id     article_position
5667           2*
56             5
58             10
443            15
88             20
322            30

最后,您需要更新所有article_position,以防止某些文章之间的插入空间不足。但这可以在某个计划的维护间隔内完成,而不是每次article_position更改时都会完成。