`position`列在数据库中,如何重新排序?

时间:2014-01-06 12:53:41

标签: php mysql

我有下表:

id | name | position
1    Bob     4
2    Jim     5
3    Harry   73
4    Paul    89

我希望用户能够按照他们认为合适的方式重新排序列,例如使用position列向上和向下移动一行。为了满足所有事件的需要,我在那里投入了大量数据(73和89)。

有没有办法通过SQL动态重新排序表?或者当有人选择“向上移动”“哈利”时,我是否必须手动重新订购所有牌桌?我只能想象我必须:

  1. 在Harry之前找到ID(在这种情况下为'2')
  2. 将所有ID(包括“2”)向上移动一次。
  3. 将Harry的位置设置为'2'。
  4. 使用MySQL / PHP必须有一种更简单的方法吗?

3 个答案:

答案 0 :(得分:1)

如果按向上或向下按下后可以提供位置订单,您可以使用以下查询。也就是说,如果当前位置是4,5,73,89,假设用户选择89并按下。在这种情况下,如果您可以提供4,5,89,73查询,那么以下查询将帮助您

select * from table22 order by field(position,4,5,89,73);

答案 1 :(得分:0)

您只需在更新语句中使用一个简单的案例,请参阅下面的示例以移动数字。对于移动倒数,同样的情况进行微调,你可以使用嵌套的情况来决定通过比较数字和目的地来使用哪个

set @nr=4; set @dest=2;
select *,

case 
when number between  @dest and @nr-1 then number+1
when number=@nr then @dest
else number
end as number_alt

 from
(
select 1 as number  union select 2 union select 3 union select 4 union select 5
)a

答案 2 :(得分:0)

对于那些将来会发现这个页面的人,我发现了一些来自旧商店的代码:

if((isset($_POST['moveup_x'])) || (isset($_POST['movedown_x']))) {
$current = select("SELECT `position` FROM `events` WHERE `id`='".rEsc($eventid)."';", true,true);

    if(isset($_POST['moveup_x'])) $target = ($current - 1); 
    if(isset($_POST['movedown_x'])) $target = ($current + 1); 

    if($current > 1) {
        $counter = 1;
        foreach(select("SELECT `id` FROM `events` ORDER BY `position`;") as $val) 
        {
            $newposition = $counter;
            if($current == $newposition) {
                $newposition = $target;     
            } elseif(($current > $newposition) && ($target <= $newposition)) {
                $newposition++;
            } elseif(($current < $newposition) && ($target >= $newposition)) {
                $newposition--;
            }
            runSQL("UPDATE `events` SET `position`='{$newposition}' WHERE `id`='{$val['id']}';");
            $counter++;
        }
        array_push($msgs,"Successfully moved event.");
    } else {
        array_push($msgs,"!Cannot move the event any higher up the list.");
    }
}

你需要知道你的当前,你可以从$ _POST(在这种情况下,我从数据库中的rowID获得)和你的目标(我有img提交按钮,因此我只是在用户点击的任何按钮上使用或加号) )。完成后,循环遍历表中的每一行,但是你认为合适,(事先设置一个计数器)并运行IF / ELSE语句。根据您的需要进行修改。

虽然效果很好。有可能是一种更快捷/更简单的方法,即所有在一个SQL语句中,而不是更新数据库中的每一行,但我找不到它。