使用PHP重新排序mysql行

时间:2010-05-25 21:53:03

标签: php mysql

| id  | url    | title  | menu_id |
------+--------+--------+----------
| 1   | http://| link 1 | 1       |
| 2   | http://| link 2 | 2       |
| 3   | http://| link 3 | 3       |
| 4   | http://| link 4 | 4       |

嗨,我想知道是否有可能使用PHP将上述内容重新排序为下面的内容。我正在尝试生成一个菜单,可以通过单击向上或向下箭头轻松地重新排序。我不知道从哪里开始。任何帮助将非常感激。

| id  | url    | title  | menu_id |
------+--------+--------+----------
| 1   | http://| link 1 | 2       |
| 2   | http://| link 2 | 4       |
| 3   | http://| link 3 | 3       |
| 4   | http://| link 4 | 1       |

5 个答案:

答案 0 :(得分:4)

我使用以下代码

$menu_id = $_GET['page_id'];
$page_order = $_GET['page_order'];
if ($_GET['do'] == 'up') {


mysql_query("UPDATE menu SET menu_order = '$page_order' +1 WHERE id != '$menu_id' AND menu_order < '$page_order'");
mysql_query("UPDATE menu SET menu_order = menu_order -1 WHERE id = '$menu_id'");    


} else if ($_GET['do'] == 'down') {

mysql_query("UPDATE menu SET menu_order = '$page_order' -1 WHERE id != '$menu_id'");
mysql_query("UPDATE menu SET menu_order = menu_order +1 WHERE id = '$menu_id'");    


} 

答案 1 :(得分:2)

这绝对是可能的,但你必须做一些额外的逻辑,这不是可以在一个查询中完成的事情。

考虑单击向上/向下箭头时的步骤。例如,假设您从订单1,2,3,4开始,然后单击#3上的向上箭头。必须要做两件事才能将顺序更改为1,3,2,4:

  • 3的位置变为2(减少1)

  • 2的位置变为3(它增加1)

因此,您必须更改他们点击的项目的位置,以及之前处于新位置的项目。单击向下箭头几乎相同,但增加/减少反转。

答案 2 :(得分:1)

我遇到了同样的问题,并使用if语句查询解决了这个问题。这是一步一步的说明: 1。 在更新mysql之前获取项目的位置。

$query = "SELECT * FROM table WHERE id=1;
$result = mysql_query($query);
$item = mysql_fetch_array($result);

$old_position = $item["position"];

我们在页面中有一个表单,因此我们从$ _POST数据中获取新位置。

$new_position = $_POST["position"];


we determine if we moved the item up or down

if ($new_position > $old_position) { //moved it down
$query = "UPDATE table SET position = position-1 WHERE position >= {$old_pozisyon} AND position <= {$new_pozisyon} and id <> {$id}";

}

我们对其他条件做同样的事情,但这次我们做位置+ 1。希望这有帮助

答案 3 :(得分:0)

@DaveE的想法正确,但是导致其他行的所有排序数据都更高或更低(取决于方向)。这是我的PHP / MySQL:

if ($direction == 'up') {
    $q1 = "UPDATE table SET sort = ($sort +1) WHERE id != $pgid AND sort = ($sort -1);";
    if($r = mysqli_query($q1, $dbsvr)) {
        $q2 = "UPDATE table SET sort = (sort -1) WHERE id = $pgid;";
        $r = mysqli_query($q2, $dbsvr);
    }
} else if ($direction == 'down') {
    $q3 = "UPDATE table SET sort = ($sort -1) WHERE id != $pgid AND sort = ($sort +1);";
    if($r = mysqli_query($q3, $dbsvr)) {
        $q4 = "UPDATE table SET sort = (sort +1) WHERE id = $pgid;";
        $r = mysqli_query($q4, $dbsvr);
    }
} else {
    echo 'no direction';
}

答案 4 :(得分:-1)

理想情况下,您应该使用SQL查询解决此问题,而不是使用PHP对行进行排序。但是如果由于某种原因需要在PHP中进行排序,请使用array_multisort()

首先应创建一个数组,其中数组的每个项都是查询中的mysql行。然后使用array_multisort()PHP函数按要排序的字段对行进行排序。有关实现详细信息,请参阅此页面上的示例3: http://php.net/manual/en/function.array-multisort.php