2014-07-07 6 views
0

J'ai créé table1 que je peux mettre à jour par un formulaire, donc si je dois changer un pourcentage de prix je peux sans avoir besoin d'éditer le code. J'importe et crée une table temp2 à partir d'un fichier csv. La nouvelle table temporaire 2 a le coût des articles, donc je dois multiplier par un pourcentage pour obtenir le prix de vente, d'où le pourcentage de prix dans la table1.Multiplier une colonne par une colonne dans une autre table

Pourcentage est une colonne dans un tableau1 et je veux le sélectionner par l'ID de ligne, importID est l'ID de colonne, les deux sont dans la table1 que je peux mettre à jour par un formulaire. Je dois sélectionner par identifiant de ligne pour la croissance future et les pourcentages multiples.

Je veux multiplier la colonne des prix dans la table temp2 par la colonne pourcentage de ma table permanente1.

Voici la partie qui me donne une erreur de syntaxe

SELECT percent FROM my_table1 WHERE importID = 1 

ici est le code de mise à jour des prix

UPDATE my_temp_table2 
    SELECT percent FROM my_table1 WHERE importID = 1 
    SET Price = (Price * percent); 

Répondre

1

Cela devrait être

UPDATE my_temp_table2 
SET Price = Price * (SELECT percent FROM my_table1 WHERE importID = 1); 

Cela multiplie tous les prix en my_temp_table2 avec celui trouvé dans le prix my_table1 pour importID 1.

Voici une alternative en utilisant une variable:

SELECT @percent := percent 
FROM my_table1 WHERE importID = 1; 

UPDATE my_temp_table2 
SET Price = Price * @percent; 
+0

J'apprécie l'aide de tout le monde – user3814045

1

Il semble que vous essayez de « brancher dans une variable », qui n'est pas exactement comment fonctionne SQL.

Que diriez-vous quelque chose comme ceci:

UPDATE my_temp_table2 
SET Price = Price * (SELECT percent FROM my_table1 WHERE importID = 1); 

Il est pas super performant, mais pour une mise à jour d'un temps, il devrait fonctionner correctement.

+0

@MarcusAdams - bien que j'apprécie votre enthousiasme, l'édition que vous avez faite était de nature entièrement stylistique, aucun impact sur la performance ou le résultat. Je ne me soucie pas vraiment de quelque chose comme ça, mais vous rendrez beaucoup de codeurs mécontents si vous choisissez de "réparer" leur code avec des changements stylistiques comme celui-ci. – PlantTheIdea

0

Vous souhaitez mettre à jour la colonne Price dans TOUTES les lignes de my_temp_table2? Par la valeur de la colonne percent à partir d'une seule ligne retournée à partir de my_table1?

est ici un moyen d'y parvenir:

UPDATE my_temp_table2 t 
CROSS 
    JOIN (SELECT p.percent 
      FROM my_table1 p 
      WHERE p.importID = 1 
      ORDER BY p.percent 
      LIMIT 1 
     ) q 
    SET t.Price = t.Price * q.percent 

Si votre question est indiqué importID le PRIMARY KEY (ou un UNIQUE KEY) à my_table1, vous pourriez éviter l'affichage en ligne. Le but des clauses LIMIT et ORDER BY dans la requête de vue en ligne est de s'assurer que pas plus de 1 ligne est retournée, et de rendre le résultat déterministe. (. Il y a d'autres façons d'y parvenir, par exemple un MIN() ou MAX() total)

Si importID est UNIQUE my_table1, vous pouvez simplifier la requête ci-dessus, et faites référence à juste la table sans utiliser une vue en ligne:

UPDATE my_temp_table2 t 
    JOIN my_table1 q 
    ON q.importID = 1 
    SET t.Price = t.Price * q.percent 

Il est souvent utile d'écrire ceci en tant qu'instruction SELECT avant d'exécuter la commande UPDATE. Remplacez simplement le mot clé UPDATE par SELECT ... FROM et supprimez la clause SET.Par exemple:.

SELECT t.Price    AS `old_price` 
    , q.percent   AS `percent` 
    , t.Price * q.percent AS `new_price` 
    FROM my_temp_table2 t 
    JOIN my_table1 q 
    ON q.importID = 1 

Un changement qui de nouveau dans une mise à jour en remplaçant SELECT ... FROM avec le mot-clé UPDATE, et ajouter une clause SET (pour affecter le résultat de l'expression qui renvoie new_price, à la colonne Prix

Notez que si aucune ligne correspondante se trouve dans my_table1, la requête/mise à jour sera de retour/jour zéro lignes.

Si vous n'utilisez pas une opération JOIN et que vous utilisez plutôt une sous-requête dans la clause SET, une valeur NULL retourné par le subque ry donnera une valeur NULL affectée à la colonne Price.

Questions connexes