#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
имеет значение места и не связано с таблицей cars2. Извините, я обновил
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 если это работает, то отметьте его как принятый для справки как работает принятие ответа