说我有id
,catname
和order
字段的5行:
+----+----------+-----+
| 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的连接语句进行链接?
答案 0 :(得分: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
。
答案 1 :(得分: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;
答案 2 :(得分:0)
无论如何,将订单数据放入您将要选择/提取的行中肯定会比具有不同表的连接更快。在更新方面,如果您拥有良好的索引,则无关紧要。所以,我会采用一种表格方法。