##一次執行多條數據排序操作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:

* * * * *
**去重說明**
每移動一次會產生一個預留位,下次區域順移的時候可能會有數據被移動到預留位,這時候需要再次移動預留位上的數據,但是如果有多條相鄰的預留位,移動后還是在預留位上,所以最多需要移動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