如果我有一个数据库字段列表:
id order title
1 3 This is a post
2 1 This is another post
3 2 This is also a post
4 4 This is still a post
我想根据顺序改变这些的顺序。
如果我将 id #1 上的顺序设置为 2,我希望将 id #3 上的顺序设置为 3。
如果我将 id #4 上的顺序设置为 1,我希望 id #1 上的顺序为 4,id #2 上的顺序为 2,id #3 上的顺序为 3,依此类推。
我该怎么做?我认为这应该很简单,但我无法弄清楚。
我已经搜索过,但我不知道要搜索什么...
您可以使用两个UPDATE
语句在 SQL 中执行此操作:
START TRANSACTION;
SELECT order FROM t WHERE order BETWEEN $new_order AND $old_order FOR UPDATE;
UPDATE t SET order = order + 1 WHERE order BETWEEN $new_order AND $old_order;
UPDATE t SET order = $new_order WHERE id = $id;
COMMIT;
在这些更新期间,我已经锁定了表以防止并发问题(但是,请注意,事务/锁定仅适用于InnoDB表)。
首先,您必须找到$other_row
,具有要重用的order
值的那个。然后更改每一行的值。
$id_to_set = 1;
$order_to_set = 2;
// Find the order that will need to be swapped
$result = mysql_query("select order from xxx where id = $id_to_set");
$row = mysql_fetch_row($result);
// Find the other row that will be modified
$result = mysql_query("select id from xxx where order = $order_to_set");
$other_row = mysql_fetch_row($result);
// Do the actual swapping
mysql_query("update xxxx set order = $order_to_set where id = $id_to_set");
mysql_query("update xxxx set order = " . $row['order'] . " where id = " . $other_row['id']);
有两种
方法:阅读 SQL 文档并在查询中使用 ORDER BY 关闭
阅读 PHP 文档并使用 usort 函数