Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在按列排序的表中移动记录的最佳方法_Php_Mysql_Sql_Sorting - Fatal编程技术网

Php 在按列排序的表中移动记录的最佳方法

Php 在按列排序的表中移动记录的最佳方法,php,mysql,sql,sorting,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”获得“Sort”的“Id@

在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”获得“Sort”的“Id@over”和“Id@over”获得“Sort”的“Id=4”

我在乞讨上的东西:

  • 我要移动的记录的Id
  • 我要移动的方向(上/下)
我到底想要什么

  • 我的记录上移或下移(交换“排序”值)
  • “排序”列中的连续数字
我想怎么做

  • 因为我使用的是php5.4,所以我可以使用这种语言中的一些代码,而不仅仅是纯sql
  • 我必须为高负载和同时请求做好准备
  • 我不想创建MySQL过程或函数。最好的方法是在一个简单的查询中完成
我尝试过的

  • 最简单的方法是使用php和:
    • 获取当前Id的“排序”(第一次查询)
    • 查找上/下列的Id(第二次查询)
    • 获取此列的“排序”(第三次查询)
    • 交换“排序”值(第4次和第5次查询)
优点是这个方法非常简单,我想就这些

缺点是两行暂时具有相同的“排序”值。另一个原因是,当两个脚本同时运行时,结果可能是不可预测的。此外,删除任何记录后,在计算中也会出现漏洞

  • 更复杂,也使用php
    • 将“排序”更改为浮动(在beggining,而不是每次)
    • 从记录中减去或添加1.5
    • 更新SQL查询中的或记录以使数字连续
优点:无需阅读有关下一条/上一条记录的任何内容。在每次移动之后,我们确信“排序”数字是可以的。我们可以在排序时使用UNIQUE

缺点:在大型表中,分配新的排序号需要大量CPU时间。我说得对吗?我们还有与Id不同类型的“Sort”

  • 与以前类似
    • 从要移动的记录中减去/添加1
    • 使用我们的Id作为第二个排序参数,通过查询分配连续的数字
优点:同上,但无法使用UNIQUE。但我们有和Id相同类型的“Sort”

缺点:在一段时间内,两条记录具有相同的“排序”,cpu使用率较高(?)

到目前为止,这些是我所知道的最好的方法。你们中有谁认识其他人,把所有的优点联系起来而没有缺点


感谢您的重播。

您需要对要移动的记录进行一次查询才能获得排序索引。然后,您应该将新的排序索引作为来自排序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?
updatetable SET sort\u index=sort\u index+1其中sort\u index>=?新的排序索引?和排序索引<?旧排序索引?
这在新的排序索引处创建了一个空间?在旧的排序索引中删除了一个空格

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

如果你的索引是稀疏的(即存在漏洞),那么后一种方法是有效的,而前一种方法不是,所以请记住这一点