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 :

pb avec Group by et INNER JOIN/UPDATE TABLE


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 15
    Points : 9
    Points
    9
    Par défaut pb avec Group by et INNER JOIN/UPDATE TABLE
    Bonsoir,

    j'ai recherché désespérement la solution sur des tas de forums mais pas trouvé ! je suis sur le serveur OVH en msql5-5. je veux mettre à jour la table totalcom avec les données de la table réglements qui comprend plusieurs lignes.
    Voici le code :
    ajout des enregistrements de la table reglements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    UPDATE totalcom 
    INNER JOIN reglements ON totalcom.clientid = reglements.clientid 
        AND totalcom.datedevis = reglements.datedevis
    SET totalcom.montantregle = reglements.montantregle, 
    totalcom.typereglement = reglements.typereglement, 
    totalcom.datereglement = reglements.datereglement, 
    totalcom.montantremb = SUM(reglements.montantremb), 
    totalcom.dateremb = MAX(reglements.dateremb) 
    GROUP BY reglements.clientid, reglements.datedevis";
    voici le message d'erreur : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY reglements.clientid, reglements.datedevis' at line 3

    je ne vois pas où est le pb de syntaxe ... qqu'un peut m'aider ?
    merci par avance
    Larentia

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Je pense qu'il faudrait peut-être mettre le GROUP BY avant le SET.
    Je vois par contre un autre problème :
    Vous faites un GROUP BY à cause des fonctions de calcul SUM et MAX mais les valeurs de typereglement, datereglement et montantregle seront aléatoires car elles ne font pas partie des fonctions de regroupement. Le SGBD prendra la première valeur qu'il rencontrera.

    Dites-nous plus précisément ce que vous voulez faire comme mise à jour. J'en ai une petite idée et ce problème a déjà été soulevé sur le forum.

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 770
    Points
    23 770
    Par défaut
    Bonjour,

    Quand on regarde la documentation MySQL à propos du UPDATE, on ne voit pas la clause GROUP BY.
    Je doute que ce soit possible...
    Une solution consisterait à mettre les totaux dans une table temporaire, puis faire la mise à jour entre la table cible et la table temporaire. Ainsi, plus de problème d'agrégation dans le UPDATE.

    ced

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 15
    Points : 9
    Points
    9
    Par défaut GROUP BY avec UPDATE
    Bonsoir,

    en fait, la table 'totalcom' est une table temporaire que j'alimente avec une autre table qui s'appelle 'Devis', qui contient toute les lignes détaillées de la commande. Je fais appel à deux sous programmes :
    - un qui vide la table temporaire et fait un INSERT INTO table 'totalcom' avec les données résumées de la table 'devis' (Total commandé, expédié ...etc)
    - un qui fait l'UPDATE de la table 'totalcom' avec les données résumées de la table 'réglements' (oui j'ai pensé ensuite au pb sur le champ typereglement et je pensais que le GROUP BY fonctionnait avec MAX sur la datereglement) en se basant sur les champs communs clientid et datedevis.

    merci pour votre aide.
    Larentia

    Citation Envoyé par CinePhil Voir le message
    Je pense qu'il faudrait peut-être mettre le GROUP BY avant le SET.
    Je vois par contre un autre problème :
    Vous faites un GROUP BY à cause des fonctions de calcul SUM et MAX mais les valeurs de typereglement, datereglement et montantregle seront aléatoires car elles ne font pas partie des fonctions de regroupement. Le SGBD prendra la première valeur qu'il rencontrera.

    Dites-nous plus précisément ce que vous voulez faire comme mise à jour. J'en ai une petite idée et ce problème a déjà été soulevé sur le forum.

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 770
    Points
    23 770
    Par défaut
    Alors tout est peut-être faisable en une seule requête .
    Peut-on avoir le schéma des différentes tables et la correspondance entre les champs ?

    ced

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 15
    Points : 9
    Points
    9
    Par défaut GROUP BY avec UPDATE
    Bonjour,

    voici le schéma des tables :

    CREATE TABLE `devis` (
    `panierid` int(5) NOT NULL auto_increment,
    `clientid` int(5) NOT NULL,
    `session` varchar(255) default '0',
    `fournisseur` varchar(255) NOT NULL,
    `page` int(4) default NULL,
    `codebarre` varchar(20) default NULL,
    `reference` varchar(20) NOT NULL,
    `designation` text NOT NULL,
    `designation1` text,
    `couleur` text,
    `qteminfourn` int(6) NOT NULL,
    `prixconseilttc` decimal(10,2) NOT NULL,
    `prixoptim` decimal(10,2) NOT NULL,
    `qteminpart` text,
    `uniteventepart` text,
    `qtecommandee` int(4) NOT NULL default '0',
    `poids` varchar(255) default NULL,
    `largeur` varchar(255) default NULL,
    `codetva` decimal(10,3) NOT NULL,
    `prixunitht` decimal(10,2) default NULL,
    `prixventettc` decimal(10,2) NOT NULL,
    `emplacement` varchar(12) default NULL,
    `statut` varchar(100) NOT NULL default 'En Attente',
    `retour` varchar(15) default NULL,
    `comments` text NOT NULL,
    `datedevis` datetime default NULL,
    `dateconfdevis` date default NULL,
    `dateenvoidevis` date default NULL,
    `datecomm` date default NULL,
    `qteexped` int(4) default '0',
    `datexped` date default NULL,
    `reliquatexp` int(11) default '0',
    `dateexpreliquat` date default NULL,
    `qtesupp` int(4) default '0',
    `termine` enum('Oui','Non') default 'Non',
    `qteretour` int(4) default '0',
    `dateretour` date default NULL,
    PRIMARY KEY (`panierid`)

    CREATE TABLE `portremise` (
    `portid` int(5) NOT NULL auto_increment,
    `clientid` int(6) NOT NULL,
    `session` varchar(255) default NULL,
    `datedevis` datetime NOT NULL,
    `dateconfirmation` date NOT NULL,
    `datecomm` date default NULL,
    `port` decimal(10,2) NOT NULL,
    `remise` decimal(10,2) NOT NULL,
    `statut` varchar(30) NOT NULL,
    `portcomm` decimal(10,2) default NULL,
    `remisecomm` decimal(10,2) default NULL,
    `remisecomm1` decimal(10,2) default '0.00',
    `tauxremise` decimal(10,2) NOT NULL,
    `statutcomm` varchar(30) default NULL,
    `datereliquat` date default NULL,
    `remiseretour` decimal(10,2) default NULL,
    `dateretour` date default NULL,
    PRIMARY KEY (`portid`)

    CREATE TABLE `reglements` (
    `regltid` int(4) NOT NULL auto_increment,
    `clientid` int(4) NOT NULL,
    `typereglement` varchar(30) NOT NULL,
    `datereglement` date NOT NULL,
    `datedevis` datetime NOT NULL,
    `montantregle` decimal(10,2) NOT NULL,
    `dateremb` date default '0000-00-00',
    `montantremb` decimal(10,2) default '0.00',
    `typeremb` varchar(30) default ' ',
    PRIMARY KEY (`regltid`)

    Les champs communs sont clientid et datedevis. l'objectif est d'avoir dans la table totalcom, une seule ligne par commande avec les infos résumées des autres tables.

    Merci pour le temps que vous me consacrez.



    Citation Envoyé par ced Voir le message
    Alors tout est peut-être faisable en une seule requête .
    Peut-on avoir le schéma des différentes tables et la correspondance entre les champs ?

    ced

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 15
    Points : 9
    Points
    9
    Par défaut GROUP BY avec update
    Bon... n'ayant plus eu de réponse, j'ai choisi l'option des tables temporaires et ça marche. je cloture donc le sujet.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Double Inner Join pour table Codier ?
    Par YakiCola dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 23/07/2013, 10h10
  2. Requête + inner join+ update
    Par zorro13 dans le forum SQL
    Réponses: 4
    Dernier message: 28/10/2011, 16h26
  3. [MySQL] pas de résultat sur requete INNER JOIN 3 tables
    Par monlou dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 31/08/2010, 09h49
  4. Problème avec UPDATE et INNER JOIN
    Par korbn dans le forum Requêtes
    Réponses: 2
    Dernier message: 25/05/2009, 20h52
  5. UPDATE avec INNER JOIN
    Par steelidol dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 03/03/2006, 23h56

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