首页 > 代码库 > 一次请求对多条数据进行排序的算法(二)
一次请求对多条数据进行排序的算法(二)
序号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"); }
一次请求对多条数据进行排序的算法(二)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。