如何编写包含联接、更新和排序的查询?

Posted

技术标签:

【中文标题】如何编写包含联接、更新和排序的查询?【英文标题】: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”的情况下运行这个查询.. ??那么错误信息显示了什么? 【参考方案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) 可能会带来令人不快的性能损失。

【讨论】:

以上是关于如何编写包含联接、更新和排序的查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写带有联接和聚合的 SQLAlchemy 查询?

我如何将此查询编写为联接而不是相关查询?

如何在单个查询中使用联接和聚合函数更新表中的多行

如何使用联接编写此代码,Oracle

Django:如何编写查询以使用多列进行排序,通过模板显示

如何将子查询包含到内部联接中?