2011-11-21 4 views
1

J'ai essayé de convertir une requête SELECT complexe en une requête UPDATE, mais je continue d'obtenir l'erreur de syntaxe 1064.Conversion du complexe mysql SELECT en UPDATE

L'objectif de la requête est de mettre à jour certaines lignes qui répondent à des conditions particulières, mais les jointures et les instructions GROUP BY et HAVING rendent cela impossible avec la requête que j'ai maintenant. Je sais que ce n'est pas la bonne manière, mais je ne peux pas découvrir ce que la solution devrait être. Je serais génial si quelqu'un pouvait me dire une direction pour une solution!

Ma requête (les valeurs ne sont pas correctes, mais donnent un peu plus de contexte):

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 

Ma structure de table:

produits de table: products_id, products_image, etc. (informations de base même pour tous les produits)

Table products_specifications: specifications_id, specifications_name

Table products_to_specifications: products_id, specifications_id, contenu

Je pense que la bonne solution, je devrai utiliser une sous-requête, mais je ne suis pas sûr de savoir comment structurer la requête

Répondre

0

MySql ne prennent pas en charge GROUP BY dans l'instruction UPDATE. Vous pouvez facilement mettre à jour en faisant de la requête complexe une table dérivée comme ci-dessous.

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 

Espérons que cela vous aide.

+0

Même je ne peux pas voir le code entier ... Je pense qu'il y a une faute de frappe! vous devez remplacer p. avec t. dans tout le SELECT (sinon vous ne pouvez pas y accéder dans le dernier WHERE via t.products_id) –