le 45,2kbps de la loose
Invité n'ayant pas de compte PHPfrance
25 nov. 2005, 16:37
Si tu utilises MySQL 5 tu peux aussi utiliser une table dérivée:
Code : Tout sélectionner
UPDATE FACTURE f, (
SELECT id_facture, SUM(prix_total) AS montant_total, SUM(nb_article) AS nb_article
FROM DETAIL_FACTURE
GROUP BY id_facture
) AS x
SET f.montant_total = x.montant_total, f.nb_article = x.nb_article
Selon la taille de ta base de données c'est probablement ce qui offrira les meilleures performances. Sinon, si la base est vraiment grande tu peux "partitionner" l'UPDATE comme ça
Code : Tout sélectionner
UPDATE (
SELECT id_facture, SUM(prix_total) AS montant_total, SUM(nb_article) AS nb_article
FROM DETAIL_FACTURE
WHERE id_facture BETWEEN 1 AND 1000
GROUP BY id_facture
) AS x, FACTURE f
SET f.montant_total = x.montant_total, f.nb_article = x.nb_article
WHERE f.id_facture = x.id_facture
Dans l'exemple j'ai explicitement changé l'ordre des tables mais de toutes façons l'optimiseur de MySQL devrait le faire de façon transparente.
Dernière(s) chose(s), tout ceci n'est valide que s'il n'existe pas de factures "orphelines" (factures sans article correspondant dans DETAIL_FACTURE), que tout est indexé correctement (à priori, FACTURE.id_facture est PRIMARY et (id_facture, article) est UNIQUE PRIMARY chez DETAIL_FACTURE), et surtout que tu n'utilise cette requête dans des cas exceptionnels: en théorie le montant d'une facture ne change jamais et n'a donc pas besoin d'être mis à jour non ?
PS: @daoud, tout le monde n'a pas les moyens de s'offrir un SUM() à chaque requête donc conserver le total dans un champs est plutôt une bonne idée si c'est bien réalisé, non ?

D'ailleurs, en ce qui concerne les factures on ne pourrait pas vraiment utiliser une valeur dynamique car on a besoin du prix tel qu'il était au moment de la commande/facturation, pas le prix actuel. À moins de stocker tous les écarts de prix successifs ou d'utiliser une sorte de base de données temporelle, mais je digresse fortement là
