Mysql在循环中按变量递增

标签 mysql variables loops increment

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

我希望能够拥有从 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 循环遍历我所有的记录并一条一条保存,但我想那也好不到哪去

最佳答案

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

“删除一行时,将大于删除行的evere writer_id减1”

或者用伪代码来说:

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

关于Mysql在循环中按变量递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12679462/

相关文章:

arrays - fatal error : Cannot use string offset as an array

php - 从mysql检索数据无输出

PHP - 将基于持续时间的事件/行分组为单个 html block

javascript - 如何在Javascript中循环4个变量的值?

c# - 迭代 Excel 引用范围的最快方法 ("C20:F22")

Python - 使脚本循环直到满足条件并为每个循环使用不同的代理地址

php - Linux后台任务最大处理时间

mysql - Windows 上的 MySQL 中未启用 SSL

c++ - 从函数返回本地 var 字符串失败,而本地 var int 和 char 工作正常。为什么?

python - 如何在旧值之上向字典键添加新值以创建总和?