2012-10-01 216 views
1

我想用一个简单的MySQL查询来更新我的表与职位。 我们假设我有一个带有ID,writer_id和位置字段的书桌。由变量循环的Mysql增量

我想能够从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 @[email protected], 
      @position:=1,   -- New writer_id => set position to 1 
      @position:[email protected]+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循环,并将它们保存一个接一个,但我想这不会有什么更好的

+1

如果您通过writer_id订购,为什么需要该位置?如果您已经获得了writer_id(可能是auto_increment),那么您只需添加另一个递增整数。 –

+0

writer_id在此处不是自动增量值。 @RomanKonz这实际上是一种更好的方法,我没有想到这一点。谢谢你 – NLZ

+0

@RomanKonz,或许你想把这个“触发”的建议变成一个答案。 – MvG

回答

1

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

“当行deletet,减少艾威writer_id比删除的文件大1”

或将其说,在伪代码:

create trigger for delete... 
    update book 
    set writer_id = writer_id - 1 
    where writer_id > deleted.writer_id 
0

我引述MySQL documentation你:

作为一般规则,您不应该为用户变量赋值并读取同一语句中的值。您可能会得到您期望的结果,但这并不能保证。包含用户变量的表达式的评估顺序未定义,并可能根据给定语句中包含的元素进行更改;另外,这个顺序不能保证在MySQL服务器的版本之间是相同的。

所以你的方式试图做的事情可能工作,但带有绝对没有保证。因此我建议你在PHP中而不是MySQL中执行此操作。或者你在MySQL中使用stored procedure