php - 在 PHP pdo 中我如何使用增量标识符

标签 php mysql pdo

我有以下挑战:

“任务”表:

tasksId     int
listId      int
taskOrder   float

如果我想将所有任务从列表 2 移到列表 3,我会这样做:

// pseodo code //

@lastTaskOrder = last task order in list 3
loop - {
UPDATE tasks SET taskOrder = @lastTaskOrder + 1, listId = 3 WHERE listId = 2;        
@lastTaskOrder++
}

因此 taskOrder 保持唯一。

如果我想将所有任务从列表 2 移动到列表 3 的开头,我会做类似的事情:

// pseodo code //

@firstTaskOrder = first task order in list 3
@delta = @firstTaskOrder / @numberOfTasksToMove
UPDATE tasks SET taskOrder = @firstTaskOrder + @delta, listId = 3 WHERE listId = 2;        
@firstTaskOrder = @firstTaskOrder + @delta

mySQL + PDO + PHP 有可能吗?

最佳答案

简短的回答:是的。

较长的答案涉及一些代码。要更新您的 list_ids 并根据旧列表中的最高当前值递增它们,我必须使用带有窗口函数的子查询:

UPDATE tasks
SET list_id = :toList,
    task_order = 
                (SELECT MAX(task_order) from tasks where list_id = :toList) 
                + t2.task_sort_order
FROM ( SELECT task_id, 
    row_number() OVER (PARTITION BY list_id order by task_order) 
                AS task_sort_order 
    FROM tasks ) t2 
WHERE tasks.task_id = t2.task_id AND tasks.list_id = :fromList

编辑 这是对第一个版本的大量编辑。我已经放弃了所有的 PHP,只显示 SQL。我更改了列名,因为我的 Postgres 版本提示驼峰式名称。

关于php - 在 PHP pdo 中我如何使用增量标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13221814/

相关文章:

php - 获取两个日期之间的随机日期

php - 将 nl2br 添加到我的 Wordpress 自定义元框

php - 如果之前发送相同的查询,JavaScript 不会更新 Internet Explorer

MySql 在更新语句中使用用户定义的变量

php - PDO 捕获结果

php - 从 HTTPS 页面移动到 HTTP 页面会中断网站

javascript - 在不同的域上发布表单

mysql - 在 SQL 中使用数组

mysql/mariadb information_schema View 创建时间

php - 我应该检查 pdo php 中执行操作的返回值吗