mysql - 选择要更新的查询

标签 mysql sql sql-update ranking

我有一个像这样的选择查询

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 上收到了错误的排名,这与选择查询一起工作是正确的。

enter image description here

谢谢

最佳答案

如果没有示例结构和数据,我无法弄清楚为什么会得到错误的结果。对于 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 接缝不适用于 JOINORDER 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/

相关文章:

php - Symfony2,创建querybuilder where子句,不为空或不为空

asp.net - 用于将非英文字符存储到 SQL 数据库的 HTML/ASPX 文本框

mysql - 基于可变数量的客户分割的数据库主键

php - MySQL 查询在 NaviCat 中有效,但在 SugarCRM 中无效

mysql - 为什么更新后mysql row_count总是-1?

mysql - 在更新语句中设置变量值

PHP 动态查询构建以在 null 时支持正面和负面匹配查询

phpMyAdmin,导入 csv 时文本被截断

php - 通过对数据库使用 data-attr 访问特定行

php - 使用 SQL、Javascript 和/或 PHP 使用下拉列表中的结果填充 html 表