IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Mise à jour table agrégée


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Février 2020
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Mise à jour table agrégée
    Bonjour à tous,
    Je viens d'installer un Raspberry sur lequel j'ai installé un serveur apache, PHP, et MySQL, dans le but de m'initier avec un site de gestion financière.
    J'ai crée deux tables :
    La table Mouvements, avec les champs "date_mouvement", "depuis_compte", "vers_compte", "montant".
    La table Solde, avec les champs "compte", "somme_depuis_compte", "somme_vers_compte", "solde"

    L'idée étant que la table "Solde" soit une table agrégée de la table "Mouvements", regroupant la somme des mouvement depuis ce compte et la somme des mouvements vers ce compte.

    J'ai réussi à écrire un requête permettant d'insérer ces sommes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    -- Insérer somme des mouvements "vers" dans la table solde
    INSERT INTO wp_perso_solde(compte,somme_vers)
    SELECT wp_perso_mouvement.vers, SUM(wp_perso_mouvement.montant)
    FROM wp_perso_mouvement
    GROUP BY wp_perso_mouvement.vers
    Cette requête est planifiée périodiquement grâce à l'event scheduler.

    Mais maintenant, l'idée serait de ne pas ajouter des entrée à la table "solde" à chaque fois, mais de mettre à jour les champs existants.

    Quelqu'un aurait une idée ? Je galère avec la syntaxe...

    Merci par avance

    Thibault

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Tu peux utiliser ON DUPLICATE KEY UPDATE lors de l'insertion des données dans la table cible.
    D'après la requête j'ajouterai que la colonne compte doit être la clé primaire pour que ça fonctionne.

    Tatayo.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Février 2020
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci pur ta réponse.
    J'ai trouvé une solution qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -- MAJ TABLE AGGREGEE "wp_perso_solde"
    -- SOMME DES "VERS"
    UPDATE wp_perso_solde
    SET wp_perso_solde.somme_vers = 
        (
    SELECT 
        SUM(wp_perso_mouvement.montant) 
    FROM wp_perso_mouvement
        WHERE
         wp_perso_solde.compte=wp_perso_mouvement.vers
        )
    Qu'en penses-tu ?

    Thibault

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Avec un UPDATE tu mes à jour les lignes existantes, mais la requête n'insèrera pas les lignes "manquantes", vu qu'il n'y a pas d'INSERT.

    Donc il tu faut ici deux requêtes: une pour l'insertion, et un ne pour la mise à jour.
    Plus une troisième pour choisir entre les deux (bref pour voir si la ligne existe déjà).

    De fait tu vas lancer systématiquement 2 requête, alors qu'avec un ON DUPLICATE KEY tu ne maintiens et tu ne lances qu'une seule requête.
    Ton code est plus simple, et certainement plus performant.

    Tatayo.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Février 2020
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Ok, merci pour ton aide. Je vais fouiller ça
    Je mets le sujet en résolu.

  6. #6
    Membre confirmé Avatar de isabelle.letrong
    Femme Profil pro
    Conseil - Consultante en systèmes d'information
    Inscrit en
    Juillet 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Conseil - Consultante en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2010
    Messages : 109
    Points : 487
    Points
    487
    Par défaut
    Quelques remarques sur cette discussion:
    1. Ce n'est plutôt pas une bonne idée de mettre le résultat d'un calcul d'agrégat dans une table !
    2. Si malgré le conseil précédent vous souhaitez maintenir cette approche, la bonne raison serait, non pas un critère de performance, mais de vouloir protéger, sécuriser, centraliser ce calcul de solde, je vous conseille alors vivement de faire exécuter cette mise à jour par un trigger AFTER INSERT (voire AFTER UPDATE) sur la table wp_perso_mouvement qui viendra mettre à jour le solde dans wp_perso_solde. Le résultat sera toujours bon et maintenu à jour à chaque nouveau mouvement. Vous pourrez par ailleurs refuser que toute mise à jour du solde soit faite par une mise un autre 'agent' que ce trigger, ce qui garantira l'intégrité du solde.

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Ca peut être pertinent d'avoir le résultat d'un calcul dans une table, sous réserve que cette table soit une valeur d'arrêté (arrêté comptable, inventaire, etc.).
    Mais en ce cas, il faut bien sûr une date (ou un timestamp) d'arrêté. Or il n'y a aucune date dans la requête update. Il y a donc quelque chose qui ne va pas, sauf si la colonne a une valeur alimentée par trigger ou par défaut (mais en ce cas c'est une date système, ce qui interdit les traitements de reprise ou planifiés, ce qui est déconseillé...)

Discussions similaires

  1. Liste déroulante éditable et mise à jour table
    Par Nean dans le forum Bases de données
    Réponses: 11
    Dernier message: 02/12/2007, 23h03
  2. Débutant - Pb de mise à jour table
    Par Michel Hubert dans le forum Access
    Réponses: 4
    Dernier message: 20/04/2006, 13h53
  3. Mise à jour table liée à à sous formulaire
    Par Michel DELAVAL dans le forum Access
    Réponses: 1
    Dernier message: 15/04/2006, 16h26
  4. Relation et mise à jour table
    Par Zbbfrom39 dans le forum Access
    Réponses: 2
    Dernier message: 04/11/2005, 07h22
  5. [TQuery][DBGRID] pb de mise à jour: table en lecture seule
    Par Chrystèle Carré dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/11/2003, 09h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo