如何更新存储在mysql表中的行的顺序?

时间:2009-12-29 19:00:17

标签: mysql sql

alt text http://i.imagehost.org/0911/kaip_padaryti_valdymas_copy.png

我想更新订单,以便GALLERYPRODUCTS之前完成。

要执行此操作的查询应该是什么?

抱歉我的英文。

5 个答案:

答案 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"