Как выполнить обновление базы данных mysql для значений приращения

#mysql

#mysql

Вопрос:

Я приведу небольшой пример для моей проблемы. В моей базе данных есть две таблицы.

«Car» со строками: «id», «name». «Места» со строками: «cid»,»вес».

Вес для мест соответствует порядку мест.В автомобиле может быть от 0 до n мест. Моя проблема в том, что у меня есть сиденья с одинаковым весом в автомобиле.

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

Автомобиль

 --------------------------
     id     |  name
--------------------------
     1      |  ford
--------------------------
  

МЕСТА

 -------------------------------
     cid    |   name   | weight
-------------------------------
      1         Seat1  |    7
      1         Seat2  |    1
      1         Seat3  |    7
      1         Seat4  |    3
      1         Seat5  |    2
      1         Seat6  |    3
      1         Seat N  |   N
-------------------------------
  

И мне нужно иметь:

CID — это идентификатор автомобиля

МЕСТА

 -------------------------------
     cid    |   name   | weight
-------------------------------
      1         Seat1  |    0
      1         Seat2  |    1
      1         Seat3  |    2
      1         Seat4  |    3
      1         Seat5  |    4
      1         Seat6  |    5
      1         Seat N  |   N
-------------------------------
  

Запрос будет выполняться в очень большой базе данных и затронет много строк, поэтому он должен быть быстрым.

Я выполнил объединение таблиц, но я не знаю, как создать метод полного обновления. Для этого необходимо ВНУТРЕННЕЕ СОЕДИНЕНИЕ.

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

1. Ваш пример неверен. cid имеет значение места и не связано с таблицей cars

2. Извините, я обновил

3. Вам нужно использовать пользовательские переменные в запросе, но производительность не гарантируется

Ответ №1:

Вы можете использовать пользовательские переменные, чтобы получить серийный номер для вашего столбца веса

 update t 
join (
select `cid`, `name`,@rank:= @rank   1 rank
  from t join  
  (select @rank:=-1) t1
  order by `cid`, `name`
) t2
using(`cid`, `name`)
set weight = t2.rank
  

ДЕМОНСТРАЦИЯ

или, если вам нужен серийный вес no для каждой группы автомобилей, вы можете это сделать

 update t 
join (
select `cid`, `name`,
  @rank:=case when @group = cid
  then @rank   1
  else 0 end   rank,
  @group:=cid
  from t join  
  (select @rank:=-1,@group:= 0) t1
  order by `cid`, `name`
) t2
using(`cid`, `name`)
set weight = t2.rank
  

Демонстрационный сериал для каждой группы

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

1. @florian. ioan если это работает, то отметьте его как принятый для справки как работает принятие ответа