ОБНОВЛЕНИЕ с несколькими значениями и CONCAT - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь добавить несколько значений в поле базы данных с помощью CONCAT.

Используются две таблицы:

products_description

+-----+------------+--------------------+
| id  |products_id | products_keywords  | 
+-----+------------+--------------------+-
| 123 | 1          |  something         | 
| 124 | 2          |  somethingelse     | 
+-----+------------+--------------------+-

products_spare

+-----+------------+--------------------+
| id  |spare_id    | products_name      | 
+-----+------------+--------------------+-
| 222 | 2          |  something to add  | 
| 223 | 2          |  something to add 2| 
+-----+------------+--------------------+-

Мой запрос на обновление выглядит следующим образом:

UPDATE products_description pd
LEFT JOIN products_spare ps
ON pd.products_id = ps.spare_id
SET pd.products_keywords = CONCAT(pd.products_keywords," ",ps.products_name)

Таким образом, «что-то добавить» и «что-то добавить 2» должны входить во второй ряд таблицы products_description в поле products_keywords. Но только один делает. Я думаю, что я делаю что-то глупо здесь.

1 Ответ

1 голос
/ 17 января 2020

Это хорошо известная проблема, когда UPDATE ... JOIN ... имеет несколько совпадающих строк; как правило, происходит только одно обновление.

Вы можете обойти эту проблему, предварительно агрегировав названия продуктов каждого запасного элемента в подзапросе, используя group_concat(), а затем присоединиться.

UPDATE products_description pd
INNER JOIN (
    SELECT spare_id, GROUP_CONCAT(products_name separator ' ') products_names
    FROM products_spare 
    GROUP BY spare_id
) ps ON pd.products_id = ps.spare_id
SET pd.products_keywords = CONCAT(pd.products_keywords, ' ', ps.products_names)

Сторона примечания:

  • вы, вероятно, хотите INNER JOIN вместо LEFT JOIN (когда нет подходящей записи, обновлять нечего)

  • использовать одинарные кавычки для строк вместо двойных кавычек: это SQL стандарт

...