我有一张桌子“照片”,每张照片都有一个等级,满分为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会更有效,但是请告诉我我是否错了。
答案 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 | | |