MySQL:在位置修饰更新查询时发生UPDATE和ORDER BY的错误用法

时间:2014-02-21 16:36:06

标签: mysql sql-update

当我在1-3的列表的第2位插入Thing 2.0时,我的Ruby插件acts_as_list用于排序在位置列中产生间隙,我希望得到这个列表。

formatted_position;position;name
1;1;Thing 1
2;2;Thing 2.0;
3;4;Thing 2
4;5;Thing 3

所以我试过......

UPDATE user_ranking_items JOIN (SELECT @rownum := 0) r SET formatted_position = @rownum := @rownum + 1 WHERE ranking_id = 1 ORDER BY position ASC

但是我得到了MySQL异常UPDATE和ORDER BY的使用不正确。

如何处理?

P.S。:选择作品并从上面返回列表...

SELECT position, @rownum := @rownum + 1 AS formatted_position FROM user_ranking_items JOIN (SELECT @rownum := 0) r WHERE ranking_id = 1 ORDER BY position ASC;

1 个答案:

答案 0 :(得分:5)

“技巧”是将您正在运行的查询(使用用户变量和顺序)包装为内联视图(MySQL将其称为派生表)。在UPDATE语句中将整个视图引用为行源。

由于您已经获得了返回所需结果的查询,因此您只需要让它返回一个唯一的ID(例如主键),这样您就可以在内联视图中返回原始行之间的JOIN。 UPDATE的目标。

这样的事情:

UPDATE user_ranking_items t
  JOIN (  
         -- your query here 
       ) s
    ON s.id = t.id
   SET t.col = s.new_col_val

(这是因为MySQL首先实现了内联视图,作为临时MyISAM表,然后UPDATE引用了临时MyISAM表。)