按订单显示类别并将类别移动到特定订单

时间:2012-02-20 16:25:22

标签: php jquery mysql

  

可能重复:
  Changing order of records from the front end

我在ASC订单中显示类别有向上/向下箭头我写了代码来向上或向下移动类别

在我的数据库中我维护一个列'listorder',我现在维护所有订单我需要创建另一个功能,我在其中显示用户输入的文本字段和用户可以输入的每个类别的按钮并按移动按钮和类别将移动到该特定输入现在我的问题可以说

A类的list_order 1
B类有list_order 2
C类的list_order 3
D类的list_order 4

我想将类别 D 移至 B ,以便将类别D的list_order更新为 2 ,但如何更新所有其他类别使用php / mysql订购 就像我必须使CAT B list_order为3和C类到list_order 4想象有这么多类别所以我怎么能管理这个?我可以通过逐行更新行来做到这一点,但我不认为这是非常正确的方法

2 个答案:

答案 0 :(得分:0)

您需要更新其间的所有类别。

首先需要将所有其他行向下移动一步,然后将类别D放在正确的位置。

检查出来:

mysql> select * from categories order by list_order;
+----+------------+------------+
| id | name       | list_order |
+----+------------+------------+
|  1 | Category A |          1 |
|  2 | Category B |          2 |
|  3 | Category C |          3 |
|  4 | Category D |          4 |
+----+------------+------------+
4 rows in set (0.01 sec)

mysql> update categories set list_order = list_order + 1 where list_order >= 2;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> update categories set list_order = 2 where id = 4;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from categories order by list_order;
+----+------------+------------+
| id | name       | list_order |
+----+------------+------------+
|  1 | Category A |          1 |
|  4 | Category D |          2 |
|  2 | Category B |          3 |
|  3 | Category C |          4 |
+----+------------+------------+
4 rows in set (0.00 sec)

答案 1 :(得分:0)

快速&脏(但相当普遍)的PHP函数来改变给定元素的顺序,所有这些也应该被移动。适用于两个方向,仅影响具有新旧位置的行。

function changeOrder($id, $newPosition, $table = 'category', $sortCol = 'list_order'){
    $oldPosition = mysql_fetch_row(mysql_query("SELECT {$sortCol} FROM {$table} WHERE id={$id} LIMIT 1"));
    $oldPosition = $oldPosition[0];
    $operators = ((int)$oldPosition >= (int)$newPosition)?array('+','<=','>='):array('-','>=','<=');
    $sql = "UPDATE {$table} SET {$sortCol} = IF(id={$id},{$newPosition},{$sortCol} {$operators[0]} 1) 
            WHERE {$sortCol} {$operators[1]} {$oldPosition} AND {$sortCol} {$operators[2]} {$newPosition}";
    return mysql_query($sql)?mysql_affected_rows():FALSE;
}