1

次の課題があります。

「タスク」テーブル:

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 で可能ですか?

4

2 に答える 2

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

編集これは、最初のバージョンから大幅に編集されています。SQL だけを表示することを優先して、すべての PHP を破棄しました。私のバージョンの Postgres がキャメル ケースの名前に不満を持っていたので、列名を変更しました。

于 2012-11-04T19:27:46.313 に答える
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 しました

于 2012-11-04T21:15:21.910 に答える