Преобразование сложного mysql SELECT в UPDATE

Я пытаюсь преобразовать сложный запрос SELECT в запрос UPDATE, но я продолжаю получать синтаксическую ошибку 1064.

Целью запроса является обновление определенных строк, которые отвечают определенным условиям, однако объединения и инструкции GROUP BY и HAVING делают это невозможным с запросом, который у меня есть сейчас. Я знаю, что это неправильный путь, но я не могу понять, какое решение должно быть. Мне было бы здорово, если бы кто-нибудь мог сказать мне направление для решения!

Мой запрос (значения неверны, но дают еще один контекст):

UPDATE products p
JOIN products_to_specifications pts ON pts.products_id = p.products_id
JOIN products_specifications ps ON ps.specifications_id = pts.specifications_id
SET p.products_image = 'file_name.jpg'
WHERE ps.specifications_name IN ('color')
AND pts.content IN ('black')
AND p.products_manufacturer = 'BMW'
AND p.products_name = 'M5'
GROUP BY p.products_id
HAVING COUNT(DISTINCT ps.specifications_name) = 1 AND COUNT(DISTINCT pts.content) = 1

Моя таблица:

table products: products_id, products_image и т.д. (базовая информация для каждого продукта)

table products_specifications: specification_id, specification_name

table products_to_specifications: products_id, specification_id, content

Я думаю, что для правильного решения у меня будет использование подзапроса, но я не уверен, как структурировать запрос

1 ответ

MySql не поддерживает GROUP BY в инструкции UPDATE. Вы можете легко обновить, сделав сложный запрос в виде производной таблицы, как показано ниже.

UPDATE products p, (SELECT p.products_id FROM products p
JOIN products_to_specifications pts ON pts.products_id = p.products_id
JOIN products_specifications ps ON ps.specifications_id = pts.specifications_id
WHERE ps.specifications_name IN ('color')
AND pts.content IN ('black')
AND p.products_manufacturer = 'BMW'
AND p.products_name = 'M5'
GROUP BY p.products_id
HAVING COUNT(DISTINCT ps.specifications_name) = 1 AND COUNT(DISTINCT pts.content) = 1) AS t
SET p.products_image = 'file_name.jpg' WHERE p.products_id=t.products_id

Надеюсь, это вам поможет.

licensed under cc by-sa 3.0 with attribution.