사용자가 편집 가능한 정렬을위한 가장 좋은 방법은 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
의를 사용하여이 기능을 구현 :
:
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
에서이 기능을 구현하는 방법에 내 블로그에서이 문서를 참조하십시오