2009-12-29 83 views

回答

3

假設請求發送的order當前值和用戶點擊了該行的動作類型(上行/下行)。對於你的例子,它會像script.php?oid = 2 & action = up。 然後,你可以簡單地爲了= $ OID和順序調換有秩序= $ OID和秩序= $ OID-1行動=向上行的值和行數=行動$ OID + 1 =「向下」。

E.g.

UPDATE 
    foo as f1, foo as f2 
SET 
    f1.`order`=1, 
    f2.`order`=2 
WHERE 
    f1.`order`=2 
    AND f2.`order`=1 
+0

雖然你不能相信'訂單',可以嗎? – Franz 2009-12-29 19:11:25

+0

如果'訂單'是唯一的,爲什麼不呢? (爲什麼它不應該是唯一的?)併發將是另一個問題。 (編輯:但我承認我沒有嘗試/測試它,可能是一個更好的解決方案;-)) – VolkerK 2009-12-29 19:12:30

0

使用鏈表:保持parent_id,而不是爲了領域:

id name  parent_id 
1 products 0 
2 gallery 1 
3 contacts 2 

SELECT mo.* 
FROM (
     SELECT @r AS _parent, 
       @r := 
       (
       SELECT id 
       FROM mytable 
       WHERE parent = _parent 
       ) AS _id, 
       @order := @order + 1 AS _order 
     FROM (
       SELECT @order := 0 
       ) vars, 
       mytable 
     ) q 
JOIN  mytable mo 
ON  mo.id = q._id 
ORDER BY 
     _order 

這樣,您就可以輕鬆地與最3更新要將任何項目(或項目甚至連續塊)。

看到這篇文章在我的博客上如何實現和查詢該型號:

0

你需要不止一個查詢。例如:

SELECT order FROM table WHERE id=X 
UPDATE table SET order=order+1 WHERE order=Y 
UPDATE table SET order=order-1 WHERE id=X 

X是單擊「up」的元素的ID。 Y是第一個SELECT查詢的結果。

+0

我想補充一點,你顯然不應該,如果運行更新查詢,元素是列表的第一個或最後一個元素... – Franz 2009-12-29 19:10:45

0

假設ID是主鍵或唯一鍵...

INSERT INTO yourtable (id, order) 
VALUES (1,2), (2,1) 
ON DUPLICATE KEY UPDATE 
order=VALUES(order); 

如果表是短暫的,然後如果你把(ID,訂單)對在VALUES應用程序邏輯可能會更簡單所有錶行的子句 - 這樣你就不需要測試以查看改變了什麼。

0

我假設按鈕包含要移動的條目(button_id)

的ID,以移動條目時,首先由1移的當前項上面的項下:

UPDATE foo 
SET order = order-1 
WHERE order = ((SELECT order FROM foo WHERE id = "button_id") + 1) 

然後移動當前條目高達1:

UPDATE foo 
SET order = order+1 
WHERE id = "button_id" 

OR 要ORD向下移動一個條目呃,首先由1移的當前進入了下面的條目:

UPDATE foo 
SET order = order+1 
WHERE order = ((SELECT order FROM foo WHERE id = "button_id") - 1) 

然後向下1移動當前條目:

UPDATE foo 
SET order = order-1 
WHERE id = "button_id" 
相關問題