Преобразование сложного MySQL SELECT в ОБНОВЛЕНИЕ - PullRequest
1 голос
/ 22 ноября 2011

Я пытался преобразовать сложный запрос 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

Моя структура таблицы:

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

таблица products_specification: Спецификация_id, имя_ спецификации

таблица products_to_specification: products_id, spec_id, content

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

1 Ответ

0 голосов
/ 25 ноября 2011

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

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

...