powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос UPDATE
12 сообщений из 12, страница 1 из 1
Помогите оптимизировать запрос UPDATE
    #39638385
Appologies
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, как правильно сделать один запрос вместо этого?
UPDATE table SET column='test' WHERE column_field='field_1';
UPDATE table SET column='hello' WHERE column_field='field_2';
UPDATE table SET column='world' WHERE column_field='field_3';

Значение в столбце column должно меняться в зависимости от значения в столбце column_field
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос UPDATE
    #39638403
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очевидно, следует описать эту зависимость функцией или таблицей.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос UPDATE
    #39638406
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если поле column_field имеет высокую селективность и на него есть индекс, то лучше оставить как есть.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос UPDATE
    #39638416
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AppologiesПодскажите, как правильно сделать один запрос вместо этого?
UPDATE table SET column='test' WHERE column_field='field_1';
UPDATE table SET column='hello' WHERE column_field='field_2';
UPDATE table SET column='world' WHERE column_field='field_3';

Значение в столбце column должно меняться в зависимости от значения в столбце column_field
Код: sql
1.
2.
3.
4.
5.
6.
UPDATE table SET col = (CASE column_field
  WHEN 'field1' THEN 'test'
  WHEN 'field2' THEN 'hello'
  WHEN 'field3' THEN 'world'
END)
WHERE column_field IN ('field1','field2','field3'); -- без этого всем остальным раздаст NULL
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос UPDATE
    #39638494
Appologies
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tip78AppologiesПодскажите, как правильно сделать один запрос вместо этого?
UPDATE table SET column='test' WHERE column_field='field_1';
UPDATE table SET column='hello' WHERE column_field='field_2';
UPDATE table SET column='world' WHERE column_field='field_3';

Значение в столбце column должно меняться в зависимости от значения в столбце column_field
Код: sql
1.
2.
3.
4.
5.
6.
UPDATE table SET col = (CASE column_field
  WHEN 'field1' THEN 'test'
  WHEN 'field2' THEN 'hello'
  WHEN 'field3' THEN 'world'
END)
WHERE column_field IN ('field1','field2','field3'); -- без этого всем остальным раздаст NULL



То что надо, а если на пример мне необходимо ставить значение (field_1/field_2/field_3) сразу в 2 разных столбца, то есть дублировать, то использовать нечто похожее на это?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
UPDATE table SET col = (CASE column_field
  WHEN 'field1' THEN 'test'
  WHEN 'field2' THEN 'hello'
  WHEN 'field3' THEN 'world'
END) , 
col2 = (CASE column_field
  WHEN 'field1' THEN 'test'
  WHEN 'field2' THEN 'hello'
  WHEN 'field3' THEN 'world'
END)

WHERE column_field IN ('field1','field2','field3'); -- без этого всем остальным раздаст NULL



Либо можно в запросе как то сделать просто дублирование значений сразу в 2 колонки (значения будут одинаковые)
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос UPDATE
    #39638503
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, да, устанавливаемые значения для каждого поля нужно перечислять.
Другое дело, откуда их брать. При небольшом количестве варианты можно явно перечислить в запросе. Собственно, как в примере из первого поста - три варианта и одно поле для обновления.
При использовании одинаковых замен в двух и более местах можно сделать пользовательскую функцию, которая будет возвращать значения в соответствии с аргументом и вызывать её многократно.
Или же, перечислить соответствия в дополнительной таблице, вроде справочника, назовем её `dop`:
arg | resultfield1 | testfield2 | hellofield3 | word
Тогда можно брать соответствия так примерно:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
UPDATE 
    `table`, `dop`
SET
    `table`.`col1` = `dop`.`result`,
    `table`.`col2` = `dop`.`result`,
    `table`.`col3` = `dop`.`result`
WHERE 
    `table`.`column_field` = `dop`.`arg`
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос UPDATE
    #39638506
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AppologiesТо что надо, а если на пример мне необходимо ставить значение (field_1/field_2/field_3) сразу в 2 разных столбца, то есть дублировать, то использовать нечто похожее на это?
попробуйте col2 = col
но это не точно
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос UPDATE
    #39638508
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78попробуйте col2 = col
но это не точноВторым запросом - точно.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос UPDATE
    #39638526
Appologies
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По итогу получается вот что. В общем задача стоит в том, что бы установить значение в двух полях на основе значений из третьего. Но, если этих совпадений не найдено, необходимо устанавливать определенное число а не NULL. Такой запрос будет корректный или это костыль?
[sql]-- Устанавливаем значение в 1 столбец исходя из 3 столбца
UPDATE xf_user SET user_group_id = (CASE faction
WHEN 'LSPD' THEN '27'
WHEN 'SFPD' THEN '28'
WHEN 'FBI' THEN '29'
WHEN 'Area 51 Army' THEN '32'
WHEN 'Grove Street Gang' THEN '34'
WHEN 'Emergency Medical Services' THEN '31'
WHEN 'Los Lantos Vagos Gang' THEN '35'
WHEN 'LS News' THEN '30'
WHEN 'The Ballas Gang' THEN '33'
WHEN 'The Rifa Gang' THEN '37'
WHEN 'Varrios Los Aztecas' THEN '36'
WHEN faction='Грузчик' THEN '2'
WHEN faction='Фермер' THEN '2'
WHEN faction='Шахтер' THEN '2'
WHEN faction='Уборщик улиц' THEN '2'
WHEN faction='Строитель' THEN '2'
WHEN faction='Таксист' THEN '2'
WHEN faction='Развозчик пиццы' THEN '2'
WHEN faction='Уличный торговец' THEN '2'
WHEN faction='Мусорщик' THEN '2'
WHEN faction='Водитель автобуса' THEN '2'
WHEN faction='Развозчик продуктов' THEN '2'
WHEN faction='Инкассатор' THEN '2'
WHEN faction='Водитель погрузчика' THEN '2'
WHEN faction='Механик' THEN '2'
WHEN faction='Прораб' THEN '2'
WHEN faction='Ремонтник дорог' THEN '2'
WHEN faction='Механик' THEN '2'
WHEN faction='Дальнобойщик' THEN '2'
WHEN faction='Эвакуаторщик' THEN '2'
WHEN faction='Безработный' THEN '2'
WHEN faction='Преступник' THEN '2'
END)
WHERE faction IN ('LSPD','SFPD','FBI','Area 51 Army','Grove Street Gang','Emergency Medical Services','Los Lantos Vagos Gang','LS News','The Ballas Gang','The Rifa Gang','Varrios Los Aztecas');
-- Дублируем значение из 1 столбца во второй столбец
UPDATE xf_user SET user_group_id = display_style_group_id
WHERE faction IN ('LSPD','SFPD','FBI','Area 51 Army','Grove Street Gang','Emergency Medical Services','Los Lantos Vagos Gang','LS News','The Ballas Gang','The Rifa Gang','Varrios Los Aztecas');

-- Устанавливаем значение "2" в 1 столбец, если в 3 не найдено определенных совпадений
UPDATE xf_user SET user_group_id = '2'
WHERE faction NOT IN ('LSPD','SFPD','FBI','Area 51 Army','Grove Street Gang','Emergency Medical Services','Los Lantos Vagos Gang','LS News','The Ballas Gang','The Rifa Gang','Varrios Los Aztecas');
-- Дублируем значение "2" во 2 столбец, если в 3 не найдено определенных совпадений
UPDATE xf_user SET user_group_id = display_style_group_id
WHERE faction NOT IN ('LSPD','SFPD','FBI','Area 51 Army','Grove Street Gang','Emergency Medical Services','Los Lantos Vagos Gang','LS News','The Ballas Gang','The Rifa Gang','Varrios Los Aztecas');[/sql]
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос UPDATE
    #39638530
Appologies
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения за портянки. Не могу отредактировать предыдущее сообщение.

По итогу получается вот что. В общем задача стоит в том, что бы установить значение в двух полях на основе значений из третьего. Но, если этих совпадений не найдено, необходимо устанавливать определенное число а не NULL. Такой запрос будет корректный или это костыль?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
-- Устанавливаем значение в 1 столбец исходя из 3 столбца
UPDATE xf_user SET user_group_id = (CASE faction
WHEN 'LSPD' THEN '27'
WHEN 'SFPD' THEN '28'
WHEN 'FBI' THEN '29'
WHEN 'Area 51 Army' THEN '32'
WHEN 'Grove Street Gang' THEN '34'
WHEN 'Emergency Medical Services' THEN '31'
WHEN 'Los Lantos Vagos Gang' THEN '35'
WHEN 'LS News' THEN '30'
WHEN 'The Ballas Gang' THEN '33'
WHEN 'The Rifa Gang' THEN '37'
WHEN 'Varrios Los Aztecas' THEN '36'
WHEN faction='Грузчик' THEN '2'
WHEN faction='Фермер' THEN '2'
WHEN faction='Шахтер' THEN '2'
WHEN faction='Уборщик улиц' THEN '2'
WHEN faction='Строитель' THEN '2'
WHEN faction='Таксист' THEN '2'
WHEN faction='Развозчик пиццы' THEN '2'
WHEN faction='Уличный торговец' THEN '2'
WHEN faction='Мусорщик' THEN '2'
WHEN faction='Водитель автобуса' THEN '2'
WHEN faction='Развозчик продуктов' THEN '2'
WHEN faction='Инкассатор' THEN '2'
WHEN faction='Водитель погрузчика' THEN '2'
WHEN faction='Механик' THEN '2'
WHEN faction='Прораб' THEN '2'
WHEN faction='Ремонтник дорог' THEN '2'
WHEN faction='Механик' THEN '2'
WHEN faction='Дальнобойщик' THEN '2'
WHEN faction='Эвакуаторщик' THEN '2'
WHEN faction='Безработный' THEN '2'
WHEN faction='Преступник' THEN '2'
END)
WHERE faction IN ('LSPD','SFPD','FBI','Area 51 Army','Grove Street Gang','Emergency Medical Services','Los Lantos Vagos Gang','LS News','The Ballas Gang','The Rifa Gang','Varrios Los Aztecas');
-- Дублируем значение из 1 столбца во второй столбец
UPDATE xf_user SET user_group_id = display_style_group_id
WHERE faction IN ('LSPD','SFPD','FBI','Area 51 Army','Grove Street Gang','Emergency Medical Services','Los Lantos Vagos Gang','LS News','The Ballas Gang','The Rifa Gang','Varrios Los Aztecas');

-- Устанавливаем значение "2" в 1 столбец, если в 3 не найдено определенных совпадений
UPDATE xf_user SET user_group_id = '2'
WHERE faction NOT IN ('LSPD','SFPD','FBI','Area 51 Army','Grove Street Gang','Emergency Medical Services','Los Lantos Vagos Gang','LS News','The Ballas Gang','The Rifa Gang','Varrios Los Aztecas');
-- Дублируем значение "2" во 2 столбец, если в 3 не найдено определенных совпадений
UPDATE xf_user SET user_group_id = display_style_group_id
WHERE faction NOT IN ('LSPD','SFPD','FBI','Area 51 Army','Grove Street Gang','Emergency Medical Services','Los Lantos Vagos Gang','LS News','The Ballas Gang','The Rifa Gang','Varrios Los Aztecas');
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос UPDATE
    #39638537
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Appologiesесли этих совпадений не найдено, необходимо устанавливать определенное число а не NULL. Такой запрос будет корректный или это костыль?Никаких костылей. Есть ELSE для задания дефолтового значения, это штатный функционал CASE. Загляните в доку https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#operator_case
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос UPDATE
    #39638592
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эту всю дичь в таблицу запихните и тогда:
Код: sql
1.
2.
3.
UPDATE xf_user SET user_group_id = (SELECT id FROM `дичь` WHERE name = 'слово'),
display_style_group_id = user_group_id
WHERE faction IN (SELECT name FROM `дичь`)



пару замечаний:
больше ID-шников, в жопу слова;
есть смысл на группы поделить, вместо перечисления всего списка
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос UPDATE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]