2011-09-08 4 views
0

J'ai un db eshop et j'ai dupliqué quelques produits afin de les déplacer vers une autre catégorie (gros/détail). Je dois mettre à jour le category_id pour chaque produit qui a « [CLONE] » dans son nom, c'est ce que im faire:Mettre à jour la table en utilisant 2 jointures

D'abord, je vérifier combien de produits doivent être déplacés:

select p.product_id, pd.product, pc.category_id 
from cscart_products p 
join `cscart_product_descriptions` pd on p.product_id = pd.product_id 
join `cscart_products_categories` pc on p.product_id = pc.product_id 
where pd.product like '%CLONE%' 
and pc.category_id = '17'; -- 17 is the current category_id 

16 rangées récupérées;

Puis, j'effectuer la mise à jour:

UPDATE cscart_products_categories pc 
join `cscart_product_descriptions` pd on pc.product_id = pd.product_id 
join `cscart_products` p on pc.product_id = p.product_id 
SET pc.category_id = '30' -- the category to be moved to 
WHERE pc.category_id = '17' 
AND pd.product like '%[CLONE]%'; 

9 lignes affectées;

Comme vous pouvez le voir, seulement 9 sur 16 sont mis à jour, évidemment, quelque chose ne va pas dans ma déclaration de mise à jour, mais quoi? Les données d'échantillon peuvent être trouvés ici http://www.megaupload.com/?d=AM85UQFY

+0

J'ai mis à jour le message original parce que j'avais tort de mettre les valeurs dans la requête UPDATE dans le mauvais ordre. – bikey77

+0

Ces 7 non affectés peuvent déjà être de la valeur 30 et donc non affectés? –

Répondre

1

Votre première requête trouve 16 lignes qui ont category_id = 17.

Votre deuxième requête change 9 lignes qui avait category_id 30 to now have category_id 17.

Ainsi, après la deuxième requête, re -Opération la première requête doit découvrir 16 + 9 = 25 enregistrements avec `category_id 17.

Si vous voulez découvrir combien de résultats seront mis à jour, vous devez exécuter la première requête avec` category_id = 30:

select p.product_id, pd.product, pc.category_id 
from cscart_products p 
join `cscart_product_descriptions` pd on p.product_id = pd.product_id 
join `cscart_products_categories` pc on p.product_id = pc.product_id 
where pd.product like '%CLONE%' 
and pc.category_id = '30'; -- the one that will be changed 

-9 lignes trouvées

UPDATE cscart_products_categories pc 
join `cscart_product_descriptions` pd on pc.product_id = pd.product_id 
join `cscart_products` p on pc.product_id = p.product_id 
SET pc.category_id = '17' 
WHERE pc.category_id = '30' -- the category to be moved to 
AND pd.product like '%[CLONE]%'; 

- 9 lignes affectées

+0

Mon tort, j'ai posté les valeurs dans le mauvais ordre. Il aurait dû lire 17, 30 pas 30, 17. S'il vous plaît vérifier mon poste original à nouveau, les résultats sont bons, mon exemple était faux. – bikey77

+0

Des exemples de données peuvent être trouvés ici http://www.megaupload.com/?d=AM85UQFY – bikey77

Questions connexes