Обновление значения столбца на основе ПОРЯДКА другого запроса

#mysql #sql #count #sql-update #mariadb

#mysql #sql #количество #sql-обновление #mariadb

Вопрос:

Что у меня есть:

Привет, ребята, у меня есть две таблицы.

# 1 model Где я храню все модели

  --------------- --------- 
| id | name     |  order  |
 --------------- --------- 
|  1 | Model #1 |   null  |
|  2 | Model #2 |   null  |
|  3 | Model #3 |   null  |
|  4 | Model #4 |   null  |
 --------------- --------- 
  

# 2 video_models_model , который соединяет model и video таблицу (видео теперь не связано)

  --------- --------- 
| videoId | modelId |
 --------- --------- 
|     1   |    1    |
|     2   |    1    |
|     3   |    1    |
|     4   |    2    |
|     5   |    2    |
|     6   |    3    |
 --------- --------- 
  

до сих пор всегда, когда мне нужны были модели, я заказывал их в зависимости от того, во скольких видео они используются

 SELECT * FROM model ORDER BY (
  SELECT COUNT(*) FROM video_models_model WHERE modelId = model.id
) DESC;
  

Что мне нужно:

Однако я обнаружил, что иногда мне нужно вручную изменить положение некоторых моделей. Из-за этого я создал новый столбец `порядок` и буду использовать его для упорядочивания вещей вместо запроса выше. Однако из-за того, что в 99% случаев все останется так, как было до сих пор, есть ли способ использовать запрос выше для обновления столбца `порядок`?

Другими словами, мне нужен какой-то запрос, который создаст это в model таблице.

  --------------- --------- 
| id | name     |  order  |
 --------------- --------- 
|  1 | Model #1 |    4    |
|  2 | Model #2 |    3    |
|  3 | Model #3 |    2    |
|  4 | Model #4 |    1    |
 --------------- --------- 
  

Ответ №1:

Вы можете использовать коррелированный подзапрос:

 update model
set `order` = (
    select count(*) from video_models_model vmm where vmm.modelid = model.id
)
  

Боковой узел: order является зарезервированным словом в MySQL, следовательно, плохой выбор для имени столбца (вам нужно окружить его обратными метками везде, где вы его используете).

Комментарии:

1. Работает отлично! Примет этот ответ через 8 минут (как только смогу)