MySQL - 单个更新保存列表顺序

inf*_*rno 8 mysql sql sql-update

是否可以对列表进行排序并将订单保存在单个更新中?

我试过这种方式:

UPDATE `jos_vm_category`,(SELECT @row:=0) AS init SET @row:=@row+1, list_order=@row ORDER BY `category_name` ASC
Run Code Online (Sandbox Code Playgroud)

但得到一个错误:

1221 - UPDATE和ORDER BY的使用不正确

如果不清楚,我需要这个:

category_id | category_name | list_order
    3       |       A       |       1
    1       |       B       |       2
    2       |       C       |       3
Run Code Online (Sandbox Code Playgroud)

由此:

category_id | category_name | list_order
    1       |       B       |       1
    2       |       C       |       2
    3       |       A       |       3
Run Code Online (Sandbox Code Playgroud)

只有一个UPDATE.

所以list_order是表的一个字段,我必须保存行的顺序.(我已经有了解决方案,但是必须等待2天,所以如果没有人回答这个问题,我会发布.)

The*_*ter 9

MySql不允许ORDER BY使用多表更新.文件

您可以使用子查询:

UPDATE jos_vm_category c
    JOIN (
        SELECT category_id, (@row:=@row+1) rowNum
        FROM jos_vm_category, (SELECT @row:=0) dm
        ORDER BY category_name
    ) rs ON c.category_id = rs.category_id
SET c.list_order = rs.rowNum
Run Code Online (Sandbox Code Playgroud)

或者,您可以将它们拆分为2个查询:

SELECT @row:=0;
UPDATE jos_vm_category
SET list_order = (@row:=@row+1)
ORDER BY category_name;
Run Code Online (Sandbox Code Playgroud)

  • 我知道这是旧的,但是你发布的UPDATE语句是有史以来发布的最好的SQL语句.这正是我寻找半年以上的东西.谢谢! (2认同)