我有一个像这样的选择查询
select er.*,
(@rank := if(@ep = exam_place_id, @rank + 1,
if(@ep := exam_place_id, 1, 1)
)
) as ranking
from examresults er cross join
(select @rank := 0, @ep := -1) params
order by exam_place_id,
point desc;
我想用我获得的排名值来更新我的class_ranking列,所以我尝试将我的选择查询更新为
update examresults inner join
(select er.*,
(@rank := if(@ep = exam_place_id, @rank + 1,
if(@ep := exam_place_id, 1, 1)
)
) as ranking
from examresults er cross join
(select @rank := 0, @ep := -1) params
order by exam_place_id,
point desc
) t3
ON examresults.O_NO = t3.O_NO
set examresults.class_ranking = t3.ranking
但是我在 class_ranking 上收到了错误的排名,这与选择查询一起工作是正确的。
谢谢
最佳答案
如果没有示例结构和数据,我无法弄清楚为什么会得到错误的结果。对于 MariaDB ORDER BY
in a subselect不会工作 - 我不知道 MySQL 在这里是如何表现的。解决方法是使用带有巨大数字的LIMIT
。但是您也可以将 select 语句重写为 update 语句:
update examresults er
cross join (select @rank := 0, @ep := -1) params
set er.class_ranking =
(@rank := if(@ep = exam_place_id, @rank + 1,
if(@ep := exam_place_id, 1, 1)
)
)
order by exam_place_id,
point desc;
更新: UPDATE
接缝不适用于 JOIN
和 ORDER BY
,因此您需要消除它加入但会有两个语句:
select 0, 1 into @rank, @ep;
update examresults er
-- cross join (select @rank := 0, @ep := -1) params
set er.class_ranking =
(@rank := if(@ep = exam_place_id, @rank + 1,
if(@ep := exam_place_id, 1, 1)
)
)
order by exam_place_id,
point desc;
但是,还有另一种方法可以将排名与其自身连接起来并计算排名较差或相等的所有行:
select er.*, count(er1.id) as ranking
from examresults er
join examresults er1
on er1.exam_place_id = er.exam_place_id
and er1.point >= er.point
group by er.id
更新语句就像这样
update examresults
join (
select er.*, count(er1.id) as ranking
from examresults er
join examresults er1
on er1.exam_place_id = er.exam_place_id
and er1.point >= er.point
group by er.id
) t3 ON examresults.O_NO = t3.O_NO
set examresults.class_ranking = t3.ranking
关于mysql - 选择要更新的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36231720/