1

我正在尝试使用一个简单的 MySQL 查询来更新我的表的位置。假设我有一个带有 ID、writer_id 和 position 字段的 book 表。

我希望能够从 1 ... x 获得职位,但每个 writer_id。如果我删除一条记录,我的位置就会有间隙,所以这就是为什么我想要一个简单的查询来重置所有位置而没有间隙。

目前我有以下代码(有效),但我认为这应该更容易(并且可能更快)。

set @position := 0;
set @lastDependency := 0;
set @previousDependency := -1;

UPDATE `book` SET 
`writer_id`=(@lastDependency:=`writer_id`), -- Set writer_id of current row
position=( 
   IF (
       NOT @lastDependency=@previousDependency,
           @position:=1,            -- New writer_id => set position to 1
           @position:=@position+1   -- Same writer id, increment position
   )
), 
`writer_id`=(@previousDependency:=`writer_id`) -- Set writer_id of last used row 
ORDER BY `writer_id`, position ASC -- Order by current positions

我也可以使用 PHP 循环遍历我的所有记录并一一保存,但我想这不会更好

4

2 回答 2

1

为什么不使用具有以下功能的触发器:

“当一行被删除时,将比已删除行大的evere writer_id减少一个”

或者用伪代码说:

create trigger for delete...
    update book 
    set writer_id = writer_id - 1 
    where writer_id > deleted.writer_id 
于 2012-10-02T06:10:26.827 回答
0

让我向您引用MySQL 文档

作为一般规则,您永远不应为用户变量赋值并在同一语句中读取该值。您可能会得到预期的结果,但这不能保证。涉及用户变量的表达式的求值顺序是未定义的,并且可能会根据给定语句中包含的元素而改变;此外,不保证此顺序在 MySQL 服务器的版本之间是相同的。

因此,您尝试做事的方式可能会奏效,但绝对不能保证。因此,我建议您在 PHP 而不是 MySQL 中执行此操作。或者您使用存储过程在 MySQL 中执行此操作。

于 2012-10-02T05:31:30.807 回答