【问题标题】:Mysql increment in loop by variableMysql在循环中按变量递增
【发布时间】:2012-09-22 16:01:04
【问题描述】:

我正在尝试使用简单的 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 循环遍历我所有的记录并一个一个地保存它们,但我想这不会更好

【问题讨论】:

  • 如果您按 writer_id 订购,为什么需要这个位置?当您已经获得 writer_id 时,您只需添加另一个递增整数,这可能是一个 auto_increment int
  • writer_id 在这里不是自动增量值。 @RomanKonz 这实际上是一种更好的方法,我没有想到这一点。谢谢大佬
  • @RomanKonz,也许你想把这个“触发”建议变成一个答案。

标签: mysql variables loops increment


【解决方案1】:

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

"当一行被删除时,将比被删除行大的evere writer_id减一"

或者用伪代码说:

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

【讨论】:

    【解决方案2】:

    让我引用MySQL documentation给你:

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

    因此,您尝试做事的方式可能有效,但绝对不能保证。因此,我建议您在 PHP 而不是 MySQL 中执行此操作。或者您在 MySQL 中使用 stored procedure 来执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-09
      • 2021-09-06
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      相关资源
      最近更新 更多