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

时间:2012-11-04 19:03:19

标签: 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?

2 个答案:

答案 0 :(得分:1)

简答:是的。

更长的答案涉及一些代码。要更新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版本抱怨了驼峰名称。

答案 1 :(得分:0)

事实证明这比我想象的要容易。 我花了2个小时,但我弄清楚了:

SET @start=100;
SET @delta=1.5;
UPDATE tasks SET taskOrder = @start:= (@start+@delta), listId = 3
WHERE listId=2
ORDER BY taskOrder

我使用正确的值

对此查询进行了PDO