我的在MySQL记录的表。我需要为用户指定以维持为了他们。因此,我已经添加了一个“位置”列中。

什么是SQL语句来更新所有记录,当我移动一个特定的记录?我有这样的:

UPDATE items SET position = '2' WHERE id ='4';
UPDATE items SET position = position+1 WHERE position >= '2' AND id != '4';

但是比越大将是比如果记录已经向下移动更小。有什么诀窍?谢谢!

有帮助吗?

解决方案

否则这样的事情为例如销售订单由用户维护的行号,我发现它最好地处理它在BL或UI的数组。通常他们会想调整一些记录,有时想说“算了吧”。所以,最简单的可能只是等待,直到他们打出了“OK”按钮(或您的等价物),然后将它们全部写回当前的排序。

您可能最终处理缺失,太,这是你能处理的相同方式的另一个问题。

其他提示

会是这样做呢?

UPDATE items 
SET position = CASE position 
  WHEN $oldpos THEN $newpos 
  ELSE position + SIGN($oldpos-$newpos)
 END
WHERE position BETWEEN LEAST( $newpos, $oldpos ) 
                AND GREATEST( $newpos, $oldpos );

我测试了它几次,它似乎工作。

这是我对这样的:我的ROW_INDEX列具有数量为10的步骤(例如:0,10,20,ECC)。当用户更新,你需要知道它是否会向上或向下行之一。如果你有第2行移动到第4个(下降,所需ROW_INDEX = 30),您将ROW_INDEX 35;否则(如果上升)将其设置为25,将该值设置:

UPDATE your_table SET row_index = 35 WHERE your_id = 1234

现在你有正确的顺序,但row_indexes都搞砸了。为了解决这个问题,执行此两个查询:

SET @pos:=-10;
UPDATE your_table SET row_index = @pos:=@pos+10 WHERE ...

这是要更新所有行(或你与其中语句选择一个),并设置无间隙ROW_INDEX柱(0,10,20,30,ECC)。当然这种方式增加了对写操作负荷,但我认为这是获得在读操作顺序的最快方法。如果您删除行你可以重新运行固定顺序查询。

我建议,在最低限度,使用项目之间的大的增量(说10000)。然后,只需做的订单。如果您需要移动11000至9000和10000之间,然后只需将它设置为9500和完成的。

这并没有消除重新排序的问题,但它极大地减少它。在某些时候,你就要去删除所有的行,然后用正确的顺序readding他们更好。这样做的更新就像你正在做的是太容易出错恕我直言。

您可以考虑使用的方法链表类型,在列表一键下一个,也许前一个项目,那么你只需要更新一些记录,而不是所有的人。

有趣!好了,有没有简单的答案。我想我只是失去了一些东西。我已经想过保持外部阵列。这听起来像是个好主意。

也许这样的事情?

$item_id = $_GET['item_id']; 
$position = $_GET['new_position']; 
$old_position = $_GET['old_position'];

if($new_position < $old_position) {
    SQL: UPDATE items SET position = position+1 WHERE position >= $new_position AND position < $old_position  
} else {  
SQL: UPDATE items SET position = position-1 WHERE position <= $new_position AND position > $old_position
}  

SQL: UPDATE items SET position = $new_position WHERE item_id = $item_id 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top