【问题标题】:How to write a query with join, update and order by?如何编写包含联接、更新和排序的查询?
【发布时间】:2013-05-02 21:53:07
【问题描述】:

我有 2 个表:tblRider 和 tbl_SCORE。 tblRider 包含所有车手(竞争对手)的所有信息,并且在 tbl_SCORE 中保存了所有车手的分数。 我想更新 tblRider 中的一列 HalfPipeFinal。标准此列设置为 0,但我想为得分最高的 20 的骑手设置为 1。 (因此只有 20 名最好的骑手可以参加决赛,而那些在 HalfPipeRider 列中获得 1 的人)

这是我的查询:

UPDATE tblRider
JOIN tbl_SCORE ON tblRider.riderID = tbl_SCORE.riderID
SET tblRider.HalfPipeFinal = 1
WHERE `gameID` =35
ORDER BY `score` DESC
limit 20;**

如果我运行此查询,我会收到以下错误:“错误使用 UPDATE 和 ORDER BY” 所以我去寻找,显然你不能在连接中使用更新和排序。因此,我正在寻找另一种方法来编写此查询,其中没有 order by,但我找不到它。

感谢所有帮助。 谢谢

【问题讨论】:

  • 你不能在没有“order by”的情况下运行这个查询.. ??那么错误信息显示了什么?

标签: mysql sql join sql-update sql-order-by


【解决方案1】:

在 SQL 中,您不能将 ORDER BY 作为 UPDATE 本身的一部分。但是你可以让过滤器成为一个子查询,给它一个别名并加入它......

UPDATE tblRider r
JOIN 
(
    SELECT riderID 
    FROM tbl_SCORE
    WHERE gameID = 35
    ORDER BY score DESC
    LIMIT 20 
) s
ON r.riderID = s.riderID
SET r.HalfPipeFinal = 1;

【讨论】:

  • 这仅适用于 WHERE 条件仅涉及第二个表的情况:(
  • 是否指定了订单从子查询到外部更新的任何位置?
  • @shmosel 是的,在 ON 子句中。子查询s应该只返回第 35 场比赛中得分最高的 20 名车手。
【解决方案2】:

在我的脑海中并且没有打开 SQL 会话来测试这个你可以尝试...

UPDATE tblRider  
SET HalfPipeFinal = 1 
WHERE riderID 
IN 
(
  SELECT s.riderID 
  FROM tbl_SCORE
  ORDER BY s.score 
  DESC limit 20
)

尽管IN (subselect) 可能会带来令人不快的性能损失。

【讨论】:

    猜你喜欢
    • 2018-11-09
    • 2021-10-18
    • 2014-12-20
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多