Вот это визуальный я просто положить вместе. Представьте себе таблицу с городом и штатом, и, ну, колонну из розума!
Я хочу, чтобы обновить столбец ROWNUM, но только для строк с состоянием = Южная Каролина ... SC
И я хочу, порядок обновления, чтобы быть по названию города. И данные вставляются в физическом порядке изначально, чтобы показать, что это сработало, если имена городов SC не были первоначально вставлены в альфа-порядке.
Схема:
drop table if exists locat123;
create table locat123
( id int auto_increment primary key,
city varchar(100) not null,
state varchar(100) not null,
rownum int not null
);
insert locat123 (city,state,rownum) values
('a1','NY',-1),('a2','NY',-1),('a3','NY',-1),('a4','NY',-1),
('m1','MT',-1),('m2','MT',-1),
('s8','SC',-1),('s2','SC',-1),('s4','SC',-1),('s1','SC',-1),('s11','SC',-1);
Оператор Update с производной таблицы:
update locat123 l
join
( select l.id,l.city,@rn:[email protected]+1 as rown
from locat123 l
cross join (select @rn:=0) params
where l.state='SC' -- <==================== right there, update SC only
order by l.city -- By the way, 5 rows that are South Carolina (SC) in here
) xDerived
on l.id=xDerived.id
set l.rownum=xDerived.rown;
-- 5 rows updated
Результаты:
select * from locat123 order by state,city;
+----+------+-------+--------+
| id | city | state | rownum |
+----+------+-------+--------+
| 5 | m1 | MT | -1 |
| 6 | m2 | MT | -1 |
| 1 | a1 | NY | -1 |
| 2 | a2 | NY | -1 |
| 3 | a3 | NY | -1 |
| 4 | a4 | NY | -1 |
| 10 | s1 | SC | 1 |
| 11 | s11 | SC | 2 |
| 8 | s2 | SC | 3 |
| 9 | s4 | SC | 4 |
| 7 | s8 | SC | 5 |
+----+------+-------+--------+
Итак, почему производная таблица? Потому что нам нужно было ввести переменную для увеличения в качестве нашего счетчика. И мы использовали cross join
с единственной целью получить эту переменную во всем. И после того, как производная таблица будет решена, мы сворачиваем ее результаты в обычный шаблон Update with a Join
, который завернул его.
Естественно, поскольку пользователь FirstOne сказал, мы можем использовать Update ... order by
в некоторых ситуациях. Выше было то, что я придумал для этого.
О, и только чтобы повторить, производные таблицы часто используются для очистки нашей пользовательской информации и ее сгибания в большую часть нашего запроса.
'UPDATE .. ORDER BY'? Что это должно было делать? – FirstOne
Да. У меня есть два столбца, и 'questionNumber' всегда меняется. также я хочу изменить 'rowNumber' на основе' questionNumber'. Благодарю. –
Обновление idk с присоединением к производной таблице, которая извлекает выгоду из заказа. Почему вы все равно хотите это сделать, это [проблема XY] (http://xyproblem.info/) якобы. – Drew