Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос UPDATE / 12 сообщений из 12, страница 1 из 1
29.04.2018, 21:32
    #39638385
Appologies
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос UPDATE
Подскажите, как правильно сделать один запрос вместо этого?
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
29.04.2018, 23:03
    #39638403
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос UPDATE
Очевидно, следует описать эту зависимость функцией или таблицей.
...
Рейтинг: 0 / 0
29.04.2018, 23:53
    #39638406
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос UPDATE
Если поле column_field имеет высокую селективность и на него есть индекс, то лучше оставить как есть.
...
Рейтинг: 0 / 0
30.04.2018, 04:15
    #39638416
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос UPDATE
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
30.04.2018, 14:34
    #39638494
Appologies
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос UPDATE
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
30.04.2018, 15:06
    #39638503
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос UPDATE
В общем, да, устанавливаемые значения для каждого поля нужно перечислять.
Другое дело, откуда их брать. При небольшом количестве варианты можно явно перечислить в запросе. Собственно, как в примере из первого поста - три варианта и одно поле для обновления.
При использовании одинаковых замен в двух и более местах можно сделать пользовательскую функцию, которая будет возвращать значения в соответствии с аргументом и вызывать её многократно.
Или же, перечислить соответствия в дополнительной таблице, вроде справочника, назовем её `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
30.04.2018, 15:14
    #39638506
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос UPDATE
AppologiesТо что надо, а если на пример мне необходимо ставить значение (field_1/field_2/field_3) сразу в 2 разных столбца, то есть дублировать, то использовать нечто похожее на это?
попробуйте col2 = col
но это не точно
...
Рейтинг: 0 / 0
30.04.2018, 15:27
    #39638508
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос UPDATE
tip78попробуйте col2 = col
но это не точноВторым запросом - точно.
...
Рейтинг: 0 / 0
30.04.2018, 16:37
    #39638526
Appologies
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос UPDATE
По итогу получается вот что. В общем задача стоит в том, что бы установить значение в двух полях на основе значений из третьего. Но, если этих совпадений не найдено, необходимо устанавливать определенное число а не 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
30.04.2018, 16:51
    #39638530
Appologies
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос UPDATE
Прошу прощения за портянки. Не могу отредактировать предыдущее сообщение.

По итогу получается вот что. В общем задача стоит в том, что бы установить значение в двух полях на основе значений из третьего. Но, если этих совпадений не найдено, необходимо устанавливать определенное число а не 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
30.04.2018, 17:33
    #39638537
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос UPDATE
Appologiesесли этих совпадений не найдено, необходимо устанавливать определенное число а не NULL. Такой запрос будет корректный или это костыль?Никаких костылей. Есть ELSE для задания дефолтового значения, это штатный функционал CASE. Загляните в доку https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#operator_case
...
Рейтинг: 0 / 0
30.04.2018, 22:14
    #39638592
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос UPDATE
эту всю дичь в таблицу запихните и тогда:
Код: 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
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос UPDATE / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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