首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >#1221 - UPDATE和ORDER BY用法错误

问#1221 - UPDATE和ORDER BY用法错误
EN

Stack Overflow用户
提问于 2016-09-08 14:32:44
回答 2查看 7.7K关注 0票数 6

绕过我在另一个线程中发布的问题。我尝试使用sql语句,如下所示:

代码语言:javascript
复制
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子句,该语句就可以正常工作。有没有人知道这个问题的解决方案?

EN

回答 2

Stack Overflow用户

发布于 2016-09-08 14:37:51

如果有多个表,则不能在update语句中使用order by和limit。

引用自MySQL文档:

对于多表语法,UPDATE更新在table_references中命名的每个满足条件的表中的行。每个匹配行都会更新一次,即使它多次匹配条件也是如此。对于多表语法,无法使用ORDER BY和LIMIT。

代码语言:javascript
复制
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表的主键。

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

票数 9
EN

Stack Overflow用户

发布于 2019-01-17 15:05:56

@1000111的答案不起作用。我不知道原因,但是MySQL忽略了子查询中的ORDER BY,并使用默认的order (按Primary_key)进行了更新。一个愚蠢的解决方案是将子查询包装在另一个子查询中,以创建一个临时表。

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39384009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档