MySQL 8: функция RANK в запросе UPDATE невозможна? - PullRequest
0 голосов
/ 04 мая 2019

У меня есть таблица 'photos', у каждой фотографии есть оценка, из десяти баллов:

-- 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 путем вычисления рейтинга за все фотографии (где оценка!= ноль).Результат будет:

-- 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 говорит:

Вы не можете использовать оконную функцию 'rank'в этом контексте.

Я мог бы сделать это непосредственно в PHP, извлекая все строки с соответствующими им рангами (потому что это работает в запросе SELECT), и делать N запросов UPDATE, но я думаю, что это будет плоходля исполнения.Если у меня есть 50000 фотографий для обработки, может быть, это более эффективно с MySQL, с точки зрения производительности (время и память), но, пожалуйста, скажите мне, если я не прав.

1 Ответ

1 голос
/ 04 мая 2019

Вы можете сделать это с самостоятельным присоединением к вычисляемому столбцу:

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;

См. Демоверсию .
Результаты:

| 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  |       |                    |
...