alt text http://i.imagehost.org/0911/kaip_padaryti_valdymas_copy.png
我想更新订单,以便GALLERY
在PRODUCTS
之前完成。
要执行此操作的查询应该是什么?
抱歉我的英文。
答案 0 :(得分:3)
假设请求为用户点击的行发送当前值order
和操作类型(向上/向下)。对于你的例子,它将类似于script.php?oid = 2& action = up。
然后你可以简单地交换具有order = $ oid和order = $ oid-1的行的值for action = up和行的order = $ oid和order = $ oid + 1 for action =“down”。
E.g。
UPDATE
foo as f1, foo as f2
SET
f1.`order`=1,
f2.`order`=2
WHERE
f1.`order`=2
AND f2.`order`=1
答案 1 :(得分: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
次更新的任何项目(甚至是连续的项目块)。
在我的博客中查看有关如何实现和查询此模型的文章:
答案 2 :(得分: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是单击“向上”的元素的ID。 Y是第一个SELECT
查询的结果。
答案 3 :(得分:0)
假设id是主键或唯一键...
INSERT INTO yourtable (id, order)
VALUES (1,2), (2,1)
ON DUPLICATE KEY UPDATE
order=VALUES(order);
如果表很短,那么如果你在所有表行的VALUES
子句中放入(id,order)对,那么应用程序逻辑可能更简单 - 这样你就不需要测试看发生了什么变化。
答案 4 :(得分:0)
我假设按钮包含您要移动的条目的id(button_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"
或强> 要按顺序向下移动一个条目,首先将当前条目下方的条目向上移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"