ユーザーが編集可能なソートのための最善の方法は、linked list
にid
年代を維持することです:
user_id widget_id prev_widget_id
---- ---- ----
1 1 0
1 2 8
1 3 7
1 7 1
1 8 3
2 3 0
2 2 3
これは、この順でuser 1
ため5
ウィジェットを行います。1, 7, 3, 8, 2
。そして、この順でuser 2
ため2
ウィジェット:3, 2
あなたは(user_id, widget_id)
と(user_id, prev_widget_id)
にUNIQUE
インデックスを作成する必要があります。
意図順にウィジェットを取得するには、Oracle
で、たとえば、次のように照会できます。
SELECT w.*
FROM (
SELECT widget_id, level AS widget_order
FROM widget_orders
START WITH
user_id = :myuser
AND prev_widget_id = 0
CONNECT BY
user_id = PRIOR user_id
AND prev_widget_id = PRIOR widget_id
) o
JOIN widgets w
ON w.widget_id = o.widget_id
ORDER BY
widget_order
が注文を更新するには、あなたが最も3
行で更新する必要があります(あなたが全体を移動する場合でも、ウィジェットのブロック)。
SQL Server
とPostgreSQL 8.4
再帰CTE
Sを使用してこの機能を実装:
:
WITH
-- RECURSIVE
-- uncomment the previous line in PostgreSQL
q AS
(
SELECT widget_id, prev_widget_id, 1 AS widget_order
FROM widget_orders
WHERE user_id = @user_id
UNION ALL
SELECT wo.widget_id, wo.prev_widget_id, q.widget_order + 1
FROM q
JOIN wo.widget_orders wo
ON wo.user_id = @user_id
AND wo.prev_widget_id = q.widget_id
)
SELECT w.*
FROM q
JOIN widgets w
ON w.widget_id = q.widget_id
ORDER BY
widget_order
はMySQL
でこの機能を実装する方法についての私のブログでこの記事を参照してください。