2016-02-26 62 views
0

我有这样修改订单场

+----+-------+---------+ 
| id |order | name | 
+----+-------+---------+ 
| 1 | 2  | John | 
| 2 | 1  | William | 
| 3 | 4  | Karl | 
| 4 | 3  | Michael | 
+----+-------+---------+ 

我想从第四位移至卡尔到第二卡尔这样的顺序字段将被设置为2,约翰福音3和迈克尔4

有没有办法更新只有一个查询表?

回答

0

如果你知道卡尔已经在第四,而你知道,他的移动,那么这应该这样做:

UPDATE mytable 
SET order = (order - 1) % 3 + 2 
WHERE ORDER BETWEEN 2 AND 4 

对于一个更可重用的查询,如果某人正在从位置B移动到列表中的位置A(A < B),您应该这样做(用A和B代替实数):

UPDATE mytable 
SET order = (order - A + 1) % (B - A + 1) + A 
WHERE ORDER BETWEEN A AND B 

如果您想要移动的人下来列表中,从位置A到B,而不是,这样做:

UPDATE mytable 
SET order = (order - A - 1) % (B - A + 1) + A 
WHERE ORDER BETWEEN A AND B 

和之间将适当更新大家。

1

你可以尝试有条件更新:

UPDATE mytable 
SET myfield = CASE other_field 
    WHEN 1 THEN 'value1' 
    WHEN 2 THEN 'value2' 
    WHEN 3 THEN 'value3' 
END 
WHERE id IN (1,2,3) 
0

谢谢你的回答。

他们帮我拿出从任何位置上更新订单场任何位置B单查询:

UPDATE mytable 
SET order=MOD(order-LEAST(A,B)+SIGN(A-B),GREATEST(A,B)-LEAST(A,B)+1)+LEAST(A,B) 
WHERE order BETWEEN LEAST(A,B) AND GREATEST(A,B) 
+0

我做了一些测试,它的工作,但不是所有的工作时间。我改成了三个查询来完成这项工作。 –