当我在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;
答案 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表。)