MySQL 8:UPDATE查询中的RANK函数不可能吗?

时间:2019-05-04 15:25:27

标签: mysql sql-update rank

我有一张桌子“照片”,每张照片都有一个等级,满分为10分:

-- ID -- fileName -- grade -- last_rank_computed
   1     fn.jpg      6        NULL
   2     fn2.jpg     1        NULL
   3     fn3.jpg     2.5      NULL
   4     fn4.jpg     NULL     NULL

我需要通过计算所有照片的等级等级来填充last_rank_computed字段(等级!= null)。结果将是:

-- ID -- fileName -- grade -- last_rank_computed
   1     fn.jpg      6        1
   2     fn2.jpg     1        3
   3     fn3.jpg     2.5      2
   4     fn4.jpg     NULL     NULL

我尝试了此查询:

update photos 
set last_rank_computed = RANK() OVER ( ORDER BY grade desc )  
where grade_avg is not null 

但是MySQL说:

  

在这种情况下,您不能使用窗口功能“等级”。

我可以直接在PHP中通过获取具有各自等级的所有行(因为它可以在SELECT查询中使用)来进行此操作,并执行N UPDATE查询,但是我认为这样做对性能不利。如果我有5万张照片要处理,也许就性能(时间和内存)而言,使用MySQL会更有效,但是请告诉我我是否错了。

1 个答案:

答案 0 :(得分:1)

您可以通过自我连接到计算列来实现:

update photos p
inner join (
  select *,
    rank() over (order by grade desc) as rn
  from photos
  where grade is not null
) pp on pp.id = p.id
set p.last_rank_computed = pp.rn;

请参见demo
结果:

| id  | filename | grade | last_rank_computed |
| --- | -------- | ----- | ------------------ |
| 1   | fn.jpg   | 6     | 1                  |
| 2   | fn2.jpg  | 1     | 3                  |
| 3   | fn3.jpg  | 2.5   | 2                  |
| 4   | fn4.jpg  |       |                    |