我在创建一个在MySQL数据库中上移/下移记录的功能时遇到了问题。我目前的表格如下:
Id UNSIGNED INT AI PRIMARY | Some other columns | Sort UNSIGNED INT INDEX
假设我有一些数据:
1 | FirstRecord | 1
2 | Second | 2
3 | Third | 3
4 | 4th | 4
Much more data...
在“Id = 4”上执行“向上移动”后,我希望“Id = 4”获得“Id @above”和“Id @above”的“排序”以获得“Id = 4”的“排序”
我在begginig上的内容:
我最终想要的是什么
我想怎么做
我尝试了什么
优点是这个方法非常简单,我认为这就是全部。
缺点是暂时两行具有相同的'排序'值。另一个是当2个脚本同时运行时,结果可能是不可预测的。删除任何记录后,也会有一个漏洞。
优点:无需阅读有关下一个/上一个记录的内容。每次移动后我们都确定,“排序”数字就可以了。我们可以在Sort上使用UNIQUE。
缺点:在庞大的表格中,分配新的排序编号需要大量的CPU时间。我对吗?我们也有不同类型的'排序'而不是Id ...
优点:与上述相同,但无法使用UNIQUE。但我们与Id
的类型相同缺点:有一段时间两个记录都有相同的'排序',高CPU使用率(?)
到目前为止,这些是我所知道的最佳方法。你们中的任何人都知道任何其他人,将所有专业人士联系起来并且没有缺点吗?
感谢您的重播。
答案 0 :(得分:0)
您需要对要移动的记录进行1次查询才能获得排序索引。然后,您应该将新的排序索引作为排序UI的输入。
如果您只是交换两个项目,可以在一个查询中执行此操作:
UPDATE table SET sort_index = IF(id === ?id?, ?new_sort_index?, ?old_sort_index?) WHERE id = ?id? OR sort_index = ?new_sort_index?
使用IF
更新两条记录。
如果您可以移动多个地方的一个项目,则需要进行范围更新。首先找出方向:上/下。然后进行如下查询:
UPDATE table SET sort_index = sort_index + 1 WHERE sort_index >= ?new_sort_index? AND sort_index < ?old_sort_index?
这在?new_sort_index创建了一个空格?并删除了?old_sort_index?
的空格然后是最后一个查询,为移动的记录设置新的排序索引。
后一种方法即使您的索引稀疏(即有漏洞)前者也没有,所以请记住这一点。