我有这个表决定在我的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
(*位置更新)
当数据库很大时,这个更新查询变得非常耗时且效率低下,有没有其他方法可以做到....
答案 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更改时都会完成。