3

假设我有 5 行带有id,catnameorder字段:

+----+----------+-----+  
| id | catname  |order|
+----+----------+-----+  
|  1 | cat1     |   2 |
|  2 | cat2     |   1 |
|  3 | cat3     |   3 | 
|  4 | cat4     |   5 |
|  5 | cat5     |   4 |
+----+----------+-----+  

我想从数组中更新这 5 个类别的顺序,例如:

array(1 => 3, 2 => 4, 3 => 5, 4 => 1, 5 => 2)

最佳做法是什么?要选择每一行并使用数组中相应的顺序更新订单字段?或者创建一个包含所有这些类别的订单数组的新表,并将其用于使用例如 userid 的连接语句对两个表进行排序和链接?

4

3 回答 3

2

如果您想在一个查询中执行此操作,可以按如下方式生成 SQL 查询(假设键是现有order值):

$orders = array(
    1 => 3,
    2 => 4,
    3 => 5,
    4 => 1,
    5 => 2,
);

$sql = 'UPDATE category SET order = CASE order ';

foreach ($orders as $old => $new) {
    $sql .= "WHEN $old THEN $new ";
}

$sql .= 'END';

如果键是id条目,请使用CASE id而不是CASE order.

于 2012-05-02T09:13:03.763 回答
1

您可以使用新顺序为它们分配负值,然后将负值乘以 -1。

array(1->-3,2->-4,3->-3,4->-1,5->-2)

但是您必须通过循环遍历数组来更新每一行:

update yourTable set order=-3 where order=1;

以后使用

update yourTable set order=-1*order where order < 0;
于 2012-05-02T08:58:21.540 回答
0

无论如何,将订单数据放在您将要选择/获取的行中肯定比使用不同表的连接要快。在更新方面,这并不重要 - 只要您有良好的索引。所以,我会采用一张桌子的方法。

于 2012-05-02T08:53:40.093 回答