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 :

2 SUM 2 LEFT JOIN 3 tables et ça marche pas.


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier Avatar de thanaos
    Inscrit en
    Mai 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 94
    Points : 76
    Points
    76
    Par défaut 2 SUM 2 LEFT JOIN 3 tables et ça marche pas.
    Bonsoir à tous.
    Voilà ça marche pas. Je n'ai pas de résultat cohérent. J'ai trois tables,une pour les comptes en banque, une pour les crédits (il n'y en à pas forcement), une pour les débits (il n'y en à pas forcement non plus) et je voudrais en sortie l'id du compte, le total des crédits et le total des débits.

    C'est où que j'ma suis votré s'y vous plait ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT
     
    CRX_COMPTE.ID_COMPTE,
    SUM(CRX_DEBIT.TOTAL_DEBIT) as MONTANT_DEBIT,
    SUM(CRX_CREDIT.TOTAL_CREDIT) as MONTANT_CREDIT
     
    FROM
    	CRX_COMPTE LEFT JOIN CRX_DEBIT ON CRX_COMPTE.ID_COMPTE=CRX_DEBIT.ID_COMPTE,
    	CRX_COMPTE b LEFT JOIN CRX_CREDIT ON b.ID_COMPTE=CRX_CREDIT.ID_COMPTE
     
    WHERE CRX_COMPTE.ID_COMPTE=b.ID_COMPTE
     
    GROUP BY CRX_COMPTE.ID_COMPTE
    Apache2 / PHP5.4 / MySQL 5/ Win7/RedHat

  2. #2
    Membre averti Avatar de max44410
    Étudiant
    Inscrit en
    Juin 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2003
    Messages : 426
    Points : 301
    Points
    301
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT
     
    CRX_COMPTE.ID_COMPTE,
    SUM(CRX_DEBIT.TOTAL_DEBIT) as MONTANT_DEBIT,
    SUM(CRX_CREDIT.TOTAL_CREDIT) as MONTANT_CREDIT
     
    FROM
    	CRX_COMPTE LEFT JOIN CRX_DEBIT ON CRX_COMPTE.ID_COMPTE=CRX_DEBIT.ID_COMPTE,
    	LEFT JOIN CRX_CREDIT ON CRX_COMPTE.ID_COMPTE=CRX_CREDIT.ID_COMPTE
     
    GROUP BY CRX_COMPTE.ID_COMPTE
    et comme ca ??

  3. #3
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Ces deux "SELECT" me semblent équivalents (le deuxième étant juste plus efficace) et ont le même problème : Une jointure réalise un produit cartsien. Or les débits et crédits sont deux listes différentes. Croiser tous les débits d'un compte par tous ses crédits n'a pas de sens.

    La solution la plus simple est de faire un SELECT pour chaque somme. Sinon je ne crois pas que l'on puisse s'en sortir sans sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT CRX_COMPTE.ID_COMPTE,
           (SELECT SUM(TOTAL_DEBIT) FROM CRX_DEBIT WHERE  CRX_COMPTE.ID_COMPTE=CRX_DEBIT.ID_COMPTE) AS debit,
           (SELECT SUM(TOTAL_CREDIT) FROM CRX_CREDIT WHERE CRX_COMPTE.ID_COMPTE=CRX_CREDIT.ID_COMPTE) AS credit
    FROM CRX_COMPTE
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    SELECT CRX_COMPTE.ID_COMPTE,
           SUM(IF(op.type='D', op.montant, 0)) AS MONTANT_DEBIT,
           SUM(IF(op.type='C', op.montant, 0)) AS MONTANT_CREDIT
    FROM CRX_COMPTE
         LEFT JOIN (
                    SELECT CRX_DEBIT.ID_COMPTE AS compte,
                           CRX_DEBIT.TOTAL_DEBIT AS montant,
                           'D' AS type
                    FROM CRX_DEBIT
                    UNION ALL
                    SELECT CRX_CREDIT.ID_COMPTE AS compte,
                           CRX_CREDIT.TOTAL_CREDIT AS montant,
                           'C' AS type
                    FROM CRX_CREDIT) op
         ON op.compte=CRX_COMPTE.ID_COMPTE
    GROUP BY CRX_COMPTE.ID_COMPTE
    dans l'idée (faute d'avoir le schéma elles ne sont pas testées donc la syntaxe n'est peut-être pas parfaite). Avec les bons indexes la première requête sera probablement plus efficace. La deuxième bénéficierait probablement d'une table temporaire. A essayer.

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

Discussions similaires

  1. LEFT JOIN sur tables identiques ?
    Par Cyborg dans le forum Langage SQL
    Réponses: 16
    Dernier message: 08/11/2011, 12h18
  2. LEFT JOIN [Plusiers tables] ON [Conditions]
    Par foxrol dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/11/2010, 16h59
  3. left join et table croisée
    Par cotojo12 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/07/2010, 19h38
  4. Left JoIn - 3 tables - Group_Concat - Score
    Par julienleg dans le forum Requêtes
    Réponses: 2
    Dernier message: 20/05/2010, 15h41
  5. probleme avec LEFT JOIN multi tables
    Par hinsano dans le forum Langage SQL
    Réponses: 5
    Dernier message: 08/07/2006, 06h36

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