Как обновить несколько значений в MySQL на основе другой таблицы, используя соединение - PullRequest
0 голосов
/ 22 марта 2019

У меня есть две таблицы продуктов и фильтров.Моя таблица продуктов выглядит следующим образом: -

id    name    color_id    size_id    composition_id
 1    Test      Black     60x60 CM       Cotton
 2    Test2     Red       60X90 CM      Acryllic

Моя таблица фильтров, как показано ниже: -

id    filter_name
 1      Black
 2      Red
 22     60x60 CM 
 23     60X90 CM
 61     Cotton
 62     Acryllic

Мой ожидаемый результат, как показано ниже: -

id    name    color_id    size_id    composition_id
 1    Test       1            22           61
 2    Test2      2            23           62

Iпопробовал ниже запрос, который работает только для color_id.Запрос ниже: -

UPDATE products
INNER JOIN filters ON products.color_id = filters.filter_name
SET products.color_id = filters.id

Я хочу обновить все 'color_id, size_id ,position_id' в одном операторе обновления.Может быть, нам нужно использовать Case Casements.Кто-нибудь может помочь?

1 Ответ

2 голосов
/ 22 марта 2019

Один из способов сделать это можно с помощью набора коррелированных подзапросов, по одному для каждого столбца, который нужно найти. Мы используем COALESCE, так что если значение не найдено, мы сохраняем предыдущее значение:

UPDATE products p
  SET color_id = COALESCE((SELECT id FROM filters WHERE filter_name = p.color_id), color_id),
      size_id = COALESCE((SELECT id FROM filters WHERE filter_name = p.size_id), size_id),
      composition_id = COALESCE((SELECT id FROM filters WHERE filter_name = p.composition_id), composition_id)

Тогда вы можете SELECT * FROM products:

id  name    color_id    size_id composition_id
1   Test    1           22      61
2   Test2   2           23      62

Демонстрация на dbfiddle

Вы также можете достичь того же результата с помощью запроса UPDATE ... JOIN, который может быть более эффективным:

UPDATE products p
LEFT JOIN filters f1 ON f1.filter_name = p.color_id
LEFT JOIN filters f2 ON f2.filter_name = p.size_id
LEFT JOIN filters f3 ON f3.filter_name = p.composition_id
SET color_id = COALESCE(f1.id, color_id),
    size_id = COALESCE(f2.id, size_id),
    composition_id = COALESCE(f3.id, composition_id)

Демонстрация по dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...