##一次执行多条数据排序操作1
>序号order从1开始的递增整数,无间断无重复
为保证序号不间断、无重复,每次修改数据的序号后,都要对其他的数据序号进行顺移。
同时移动多条数据是指保证序号不间断、无重复的情况下,之后的数据移动不影响之前移动过的数据的序号。
**移动一条数据的流程**
~~~
把数据块从位置o移动到位置n,并添加1个锁定块和1个预留位(预留位=n),锁定块不再参与移动
如果o>n:区域上移
把m和n(包括m、n)之间的数据(排除锁定块)下移1位
如果o<n:区域下移
把m和n(包括m、n)之间的数据(排除锁定块)上移1位
~~~
**移动多条数据的流程**
~~~
把数据块从位置o移动到位置n,并添加1个锁定块和1个预留位(预留位=n),锁定块不再参与移动
如果o>n:区域上移
把m和n(包括m、n)之间的数据(排除锁定块)下移1位
把预留位的数据下移1位,执行c次(c=预留位数量-1)
如果o<n:区域下移
把m和n(包括m、n)之间的数据(排除锁定块)上移1位
把预留位的数据上移1位,执行c次(c=预留位数量-1)
重复上面的步骤,直到所有数据被移动到指定的位置
~~~
* * * * *
示意图1:
![](https://box.kancloud.cn/70aa35958136ce04fb54e3bcbc641108_544x407.gif)
* * * * *
**去重说明**
每移动一次会产生一个预留位,下次区域顺移的时候可能会有数据被移动到预留位,这时候需要再次移动预留位上的数据,但是如果有多条相邻的预留位,移动后还是在预留位上,所以最多需要移动c次,c=预留位数量-1。
下面是一个php实例:
~~~
//要移动的数据
$rows = array(
array(
"id"=>3,/*唯一标识*/
"moveto"=>8/*目标位置*/
),
array(
"id"=>4,
"moveto"=>9
),
array(
"id"=>12,
"moveto"=>2
)
...
)
$locked = array();//锁定块数组
$lockedorder = array();//预留位数组
foreach($rows as $row){
$o = $db->result("SELECT order FROM ".DB_TABLEPRE."user WHERE id=$row[$id] ");//数据原来的位置o
$n = $row[moveto];//目标位置n
$db->query("update user set order=$n WHERE id=".$row[$id]);//移动该条数据
if($n == $o){
//不用移动
}elseif($n > $o){
//区域上移
$db->query("update user set order=order-1 WHERE id NOT IN(implode(',',$locked)) AND order>=$o AND order<=$n ");
//执行c次排重
foreach($locked as $temp){
$db->query("update user set order=order-1 WHERE id NOT IN(implode(',',$locked)) AND order>=$from AND order<=$n AND order IN(implode(',',$lockedorder))");
}
}else{
//区域下移
$db->query("update user set order=order+1 WHERE id NOT IN(implode(',',$locked)) AND order<=$o AND order>=$n ");
//执行c次排重
foreach($locked as $temp){
$db->query("update user set order=order+1 WHERE id NOT IN(implode(',',$locked)) AND order<=$o AND order>=$n AND order IN(implode(',',$lockedorder))");
}
}
$locked [] = $row[$id];//添加一个锁定数据块
$lockedorder [] = $n;//添加一个预留位
}
~~~
- 脑袋缓存
- 微信框架
- 案例展示
- 网络营销术语
- 打印控件
- 逻辑值交换律
- 常用网址
- 开发文档类
- W3C
- PHP
- 算法
- RSA非对称加密算法
- DES对称加密算法
- SHA安全散列算法
- AES加密
- 跌了n倍再涨m倍回到原价
- 多条数据同时排序算法1
- 多条数据同时排序算法2
- 工具
- 视频工具
- 音频工具
- 电子书阅读器
- PHP学习笔记
- 函数
- 文件系统函数
- 搜索函数
- 时间函数
- 获取当前时间
- 变量处理函数
- 获取所有已定义变量
- 文本函数
- 文本替换
- ASSIC转换
- 文本截取
- 大小写转换
- 二进制比较字符串
- 数组函数
- 定义数组
- 数组变量导入符号表
- 数组排序
- 数组与字符串转换
- 数学函数
- 进制转换
- 配置常用项
- 短标记
- PHP内置WebServer
- 数据库扩展
- 抽象层PDO
- 连接管理
- 执行SQL命令
- 预处理
- MYSQL扩展
- 连接管理
- 选择数据库
- 清除BOM
- bashShell笔记
- vim基础
- 常用指令
- 用户操作
- 网络配置
- 文件权限
- Markdown笔记
- 编辑器&阅读器
- 看云
- mackpad
- 语法
- 转义字符
- git学习笔记
- 常用命令
- 基本命令
- 远程命令
- 创建仓库
- 修改配置
- 存档工作区
- WEB服务器
- 服务器技术的发展
- rewrite
- Go语言
- 在线开发环境
- bootstrap学习笔记
- 布局栅格
- CSS学习笔记
- 圆角
- 强制不换行
- 带透明度的颜色值rbga
- 渐变动画
- 滚动条控制
- 渐变过渡
- 透明度
- 背景渐变
- MYSQL笔记
- 字段类型
- SQL命令
- 用户管理-权限
- 重载用户权限
- 修复表格
- 优化表格
- 替换
- 编辑字段
- 库表的基本操作
- 环境变量
- 连表删除
- HybridApp
- 开发框架
- 即时通讯架构
- 网易云信
- 消息推送
- 消息推送协议
- 第三方消息推送方案
- javascript
- json与字符串互解析
- 大小写转换
- jQuery序列化表单
- 判断是否移动端
- 获取url中的参数
- 获取格式化的日期
- jQuery操作checked
- js实现继承
- 难点讲解
- json排序
- 特殊算法
- cookie操作
- 原生的touch事件
- HTML
- 视频标签
- zyMedia视频插件
- 百度地图URI
- DEDE织梦笔记
- 水印无效
- 支付
- nodejs
- 常用命令
- NPM