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

时间:2016-09-08 06:32:44

标签: mysql join

绕过我在另一个帖子中发布的问题。我尝试了这样的sql语句:

UPDATE user u JOIN (SELECT @i := 0) r
SET user_rank_planets = (@i := (@i + 1))
WHERE user_active=1
ORDER BY user_planets DESC

我收到错误#1221。没有order by子句,该语句可以正常工作。 是否有人知道这个问题的解决方案?

2 个答案:

答案 0 :(得分:5)

对于多个表,您不能在update语句中使用order by和limit。

从MySQL文档引用:

  

对于多表语法,UPDATE更新每个名为的表中的行   在table_references中满足条件。每个匹配的行是   更新一次,即使它多次符合条件。对于   多表语法,ORDER BY和LIMIT不能使用。

UPDATE user u 
INNER JOIN 
(
    SELECT 
    *,
    (@i := (@i + 1)) AS row_number
    FROM user u 
    CROSS JOIN (SELECT @i := 0) r
    WHERE user_active=1
    ORDER BY user_planets DESC
)AS t
ON u.Primary_key = t.primary_key
SET u.user_rank_planets = t.row_number.

注意:u.Primary_keyt.primary_key替换为user表的主键。

阅读前几段http://dev.mysql.com/doc/refman/5.7/en/update.html

答案 1 :(得分:0)

@ 1000111的答案无效。我不知道原因,但是MySQL只是忽略了子查询中的ORDER BY,并以默认顺序(通过Primary_key)进行了更新。 一种愚蠢的解决方案是将子查询包装在另一个子查询中以创建临时表。

UPDATE user u 
INNER JOIN 
(
    SELECT * FROM (
        SELECT *, (@i := (@i + 1)) AS row_number
        FROM user u 
        CROSS JOIN (SELECT @i := 0) r
        WHERE user_active=1
        ORDER BY user_planets DESC
    ) AS t1
) AS t
ON u.<Primary_key> = t.<Primary_key>
SET u.user_rank_planets = t.row_number