2012-11-04 23 views
1

我有以下挑戰:在PHP 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?

回答

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版本抱怨駱駝的名字。

+0

現在,我已經想過這個問題,我們可以肯定這個縮減爲一個單獨的查詢。我必須打破我的psql控制檯... – slashingweapon

+0

感謝您的回覆。似乎第二個查詢將所有taskOrder更改爲相同的數字。也許我做錯了什麼.. – Guy

+0

是的。這就是你在帖子和僞代碼中描述功能的方式。 – slashingweapon

0

這證明比我想象的要容易。 花了我兩小時,但我想通了:

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

我PDOed此查詢正確的值