绕过我在另一个线程中发布的问题。我尝试使用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子句,该语句就可以正常工作。有没有人知道这个问题的解决方案?
发布于 2016-09-08 14:37:51
如果有多个表,则不能在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_key和t.primary_key替换为user表的主键。
发布于 2019-01-17 15:05:56
@1000111的答案不起作用。我不知道原因,但是MySQL忽略了子查询中的ORDER BY,并使用默认的order (按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_numberhttps://stackoverflow.com/questions/39384009
复制相似问题