2012-08-05 4 views
1

J'ai un projet de mise à jour du magasin Magento priselist. J'ai une liste d'éléments que je veux mettre à jour et je veux le faire avec une requête MySQL (en pensant que c'est plus efficace). Le priselist incluent sku et le prix.Mise à jour du projet C# Liste des lignes MySQL sélectionnées à partir de deux tables

J'ai deux tables. De tableau 1 J'utilise sku mise à jour dans tableau 2 la valeur, qui est le prix de l'article quand * entity_id * sont égaux dans les deux tables et attribute_id est '64'.

Tableau 1

product_entity 

entity_id | sku 
     1 | p1 
     2 | p2 
     3 | p3 

Tableau 2

product_entity_decimal 

entity_id | attribute_id | value | 
     1 |   64 |  5 | 
     1 |   65 | NULL | 
     1 |   66 | NULL | 
     2 |   64 |  7 | 
     2 |   65 | NULL | 
     2 |   66 | NULL | 
     3 |   64 |  1 | 
     3 |   65 | NULL | 
     3 |   66 | NULL | 

Alors, comment puis-je mettre à jour avec un prix de requête p1 être 6 et prix p3 être 2.

J'essaie cette requête mais cela n'a pas fonctionné ...

UPDATE product_entity, product_entity_decimal SET product_entity_decimal.value = 
CASE 
    WHEN product_entity.entity_id = product_entity_decimal.entity_id AND product_entity_decimal.attribute_id = '64' AND product_entity.sku = 'p1' THEN '6' 
    WHEN product_entity.entity_id = product_entity_decimal.entity_id AND product_entity_decimal.attribute_id = '64' AND product_entity.sku = 'p1' THEN '2' 
    ELSE value 
END 

Pour mon projet, j'utilise C# avec .Net et MySQL 5.x en utilisant MySql.Data.MySqlClient. Peut-être qu'il y a une meilleure façon de mettre à jour la liste de 3000 éléments dans la base de données MySQL s'il y a partage s'il vous plaît. :)

Répondre

2

Vous pouvez utiliser un JOIN dans les UPDATE:

UPDATE product_entity_decimal a 
JOIN product_entity b ON a.entity_id = b.entity_id AND b.sku IN ('p1', 'p3') 
SET a.value = CASE b.sku WHEN 'p1' THEN 6 WHEN 'p2' THEN 2 END 
WHERE a.attribute_id = 64 

Si vous avez une liste de 3000 éléments que vous souhaitez mettre à jour, peut-être la meilleure façon serait de itérer sur un tableau et d'exécuter un UPDATE par itération. Ces mises à jour seraient encapsulées dans une transaction telle que dans ce pseudo-code:

// START TRANSACTION 

// For Each Value in array 
    // Execute UPDATE statement 

// COMMIT 
+0

Merci, c'était utile, mais j'ai une question. Ne nécessite-t-il pas plus de ressources côté serveur pour exécuter plusieurs requêtes SQL que celle que j'essayais? Le but de mon projet est d'alléger le côté hôte. Je suis arrivé à une autre base d'idée sur "memory = 1/calcul"; Cela signifie que sur les données d'exportation, je garderai entity_id et que ce sera simple mise à jour dans une table, mais encore une requête ou plusieurs, je pense toujours qu'une requête est meilleure que beaucoup. –

Questions connexes