我有下表:
id | name | position
1 Bob 4
2 Jim 5
3 Harry 73
4 Paul 89
我希望用户能够按照他们认为合适的方式重新排序列,例如使用position
列向上和向下移动一行。为了满足所有事件的需要,我在那里投入了大量数据(73和89)。
有没有办法通过SQL动态重新排序表?或者当有人选择“向上移动”“哈利”时,我是否必须手动重新订购所有牌桌?我只能想象我必须:
使用MySQL / PHP必须有一种更简单的方法吗?
答案 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语句中,而不是更新数据库中的每一行,但我找不到它。