如何编写包含联接、更新和排序的查询?
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)
可能会带来令人不快的性能损失。
【讨论】:
以上是关于如何编写包含联接、更新和排序的查询?的主要内容,如果未能解决你的问题,请参考以下文章