在逐列表中移动记录的最佳方法

时间:2013-09-02 14:20:56

标签: php mysql sql sorting

我在创建一个在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上的内容:

  • 我要移动的记录ID
  • 我想要移动的方向(上/下)

我最终想要的是什么

  • 我的记录向上或向下移动(交换'排序'值)
  • “排序”列中的连续数字

我想怎么做

  • 因为我使用的是php5.4,我可以使用这种语言中的一些代码,而不仅仅是纯粹的SQL
  • 我必须为高负荷和同步请求做好准备
  • 我不想创建MySQL程序或函数。最好的方法是在一个简单的查询中做到这一点

我尝试了什么

  • 最简单的方法是使用php和:
    • 获取当前ID(第一个查询)的“排序”
    • 查找上/下栏目的ID(第二个查询)
    • 获取此列的“排序”(第3个查询)
    • 交换“排序”值(第4和第5个查询)

优点是这个方法非常简单,我认为这就是全部。

缺点是暂时两行具有相同的'排序'值。另一个是当2个脚本同时运行时,结果可能是不可预测的。删除任何记录后,也会有一个漏洞。

  • 更复杂,也使用php
    • 将'排序'更改为FLOAT(在开始时,而不是每次)
    • 从记录中提取或添加1.5。
    • 更新或记录SQL查询以使数字连续

优点:无需阅读有关下一个/上一个记录的内容。每次移动后我们都确定,“排序”数字就可以了。我们可以在Sort上使用UNIQUE。

缺点:在庞大的表格中,分配新的排序编号需要大量的CPU时间。我对吗?我们也有不同类型的'排序'而不是Id ...

  • 与之前类似
    • 从我们要移动的记录中减去/添加1。
    • 使用我们的Id作为第二个排序参数,按查询分配连续数字。

优点:与上述相同,但无法使用UNIQUE。但我们与Id

的类型相同

缺点:有一段时间两个记录都有相同的'排序',高CPU使用率(?)

到目前为止,这些是我所知道的最佳方法。你们中的任何人都知道任何其他人,将所有专业人士联系起来并且没有缺点吗?

感谢您的重播。

1 个答案:

答案 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?

的空格

然后是最后一个查询,为移动的记录设置新的排序索引。

后一种方法即使您的索引稀疏(即有漏洞)前者也没有,所以请记住这一点。