码迷,mamicode.com
首页 > 编程语言 > 详细

一次请求对多条数据进行排序的算法(二)

时间:2016-12-23 19:02:57      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:http   result   class   nbsp   实例   标识   user   for   com   

序号order从1开始的递增整数,无间断无重复

为保证序号不间断、无重复,每次修改数据的序号后,都要对其他的数据序号进行顺移。
同时移动多条数据是指保证序号不间断、无重复的情况下,移动数据到指定位置。

移动流程

1.把数据移动到指定位置(修改序号)
    标记一个空位(数据原来的位置序号)
    标记一个重复位(数据移动后的位置序号)
2.对空位和重复位排序
3.移动每对空位和重复位之间的数据
    空位大于重复位:下移
    空位小于重复位:上移

示意图1:

技术分享

php实例

//要移动的数据
$rows = array(
    array(
        "id"=>3,/*唯一标识*/
        "moveto"=>8/*目标位置*/
    ),
    array(
        "id"=>4,
        "moveto"=>9
    ),
    array(
        "id"=>12,
        "moveto"=>2
    )
    ...
)
$kong = array();//空位
$chong = array();//重复位
$locked = array();//锁定数据
foreach($rows as $row){
    $locked[] = $row[$id];
    $kong[] = $o = $db->result("SELECT order FROM ".DB_TABLEPRE."user WHERE  id=$row[$id] ");//数据原来的位置o
    $chong[] =  $n = $row[moveto];//目标位置n
    $db->query("update user set order=$n  WHERE  id= ".$row[$id]);//移动该条数据
}
sort($kong);
sort($chong);
foreach($kong as $i=>$k){
    $c = $chong[$i];
    if($k == $c){
        //不移动
    }elseif($k > $c){
        //下移
        $db->query("update user set order=order+1  WHERE  id NOT IN(implode(‘,‘,$locked))  AND order<=$k AND order>=$c");
    }else{
        //上移
        $db->query("update user set order=order-1  WHERE  id NOT IN(implode(‘,‘,$locked))  AND order>=$k AND order<=$c");
    } 

 

一次请求对多条数据进行排序的算法(二)

标签:http   result   class   nbsp   实例   标识   user   for   com   

原文地址:http://www.cnblogs.com/godok/p/6215765.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!