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

Langage SQL Discussion :

[MySQL] Erreur dans une requête avec jointures


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Points : 120
    Points
    120
    Par défaut [MySQL] Erreur dans une requête avec jointures
    Bonjour,

    J'ai un petit problème avec une requête dans MySQL.
    ll s'agit plutot de SQL que de mySQL, donc je préfère poster ici.

    En premier voici ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      SELECT 
    admin_users.*, 
    sum(admin_historique.remuneration) as somme, 
    count(histo.ID) as paiement 
       FROM 
    admin_users 
       LEFT OUTER JOIN admin_historique ON (admin_historique.id_users=admin_users.id and admin_historique.type_histo='insertion' AND admin_historique.valide_paiement='oui') 
       LEFT OUTER JOIN admin_historique histo ON (histo.id_users = admin_users.id and histo.type_histo='paye') 
       GROUP BY admin_users.id
    En gros, pour expliquer ce je veut faire:
    J'ai deux tables, l'une admin_users et l'autres admin_historique.

    Je veux en fait récupérer dans un premier temps mes utilisateurs dans la table admin_users. Grâce à mon premier left join, je récupère une somme. Tout ça fonctionne bien.

    Mon problème est à mon second join. Le but est de récupérer le nbre de paiement effectué pour chaque utilisateur. Pour cela, je veux compter bêtement le nbre de retour d'où le count().

    Alors, j'ai fait un test, j'ai inséré un enregistrement dans ce sens.
    Quand j'exécute cette requête il devrait donc me donner 1 comme valeur de paiement pour utilisateur en question. Au lieu de ça, il me sort 140

    Bref, une valeur qui ne correspond à rien...

    J'ai du me planter dans ma requête mais où ?

    Mercu de votre aide précieuse !

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    et comme ça ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COUNT(DISTINCT histo.id) AS paiement
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Points : 120
    Points
    120
    Par défaut
    BINGO ! c'est ça !

    Merci beaucoup !

    Par contre, c'est byzarre comme prob !
    Je pensais (mais à tort) qu'il ne chercherait cette valeur qu'une seule fois et non plusieurs.... mais bon...

    En tout cas merci beaucoup !

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Citation Envoyé par bobic
    BINGO ! Par contre, c'est byzarre comme prob !
    Je pensais (mais à tort) qu'il ne chercherait cette valeur qu'une seule fois et non plusieurs.... mais bon...
    140, ça ne serait pas le nombre de lignes qui répondent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       LEFT OUTER JOIN admin_historique ON (admin_historique.id_users=admin_users.id and admin_historique.type_histo='insertion' AND admin_historique.valide_paiement='oui')
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Points : 120
    Points
    120
    Par défaut
    oui, tout juste !

    J'ai fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from admin_historique where id_users=6 and type_histo='insertion' AND admin_historique.valide_paiement='oui'
    et en effet, j'ai 140 résultats !!

    en fait, dans le join, je pensais (encore à tort) qu'il limitait sa requête, mais en fait non, c'est l'affichage qu'il limite (comme s'il le filtrait)

    Alors du coup, tout s'explique !

    thanks

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Citation Envoyé par bobic
    en fait, dans le join, je pensais (encore à tort) qu'il limitait sa requête, mais en fait non, c'est l'affichage qu'il limite (comme s'il le filtrait)
    C'est le GROUP BY qui regroupe sur une ligne, ce n'est pas une question d'affichage
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Points : 120
    Points
    120
    Par défaut
    Ah oui exact, j'ai zappé ce bon group by...

    Donc tout rerentre donc dans l'ordre OK.

    Bon, pour finir, j'ai tjs un chtit prob dans le même genre d'idée.
    Ma requête est donc celle-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT admin_users.*, 
    sum(admin_historique.remuneration) as somme, 
    count(DISTINCT histo.ID) as paiement 
     
    FROM admin_users 
    LEFT OUTER JOIN admin_historique ON (admin_historique.id_users=admin_users.id and admin_historique.type_histo='insertion' AND admin_historique.valide_paiement='oui') 
    LEFT OUTER JOIN admin_historique histo ON ( histo.id_users = admin_users.id and histo.type_histo='paye') 
     
    GROUP BY admin_users.id
    Problème lorsque le count(DISTINCT histo.ID) as paiement =5 (par exemple), il me multipli mon sum(....) par 5....

    Le prob vient donc du second join...

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Avec cette requête, tu supprimes tout risque :
    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
    18
    19
    20
    21
    22
    SELECT  admin_users.*
        ,   somme.somme 
        ,   paiement.paiement 
    FROM    admin_users 
        LEFT OUTER JOIN
            (   SELECT  id_users
                    ,   SUM(remuneration) AS somme
                FROM    admin_historique
                WHERE   type_histo      = 'insertion' 
                    AND valide_paiement = 'oui'
                GROUP BY    id_users
            )   AS somme
            ON somme.id_users = admin_users.id 
        LEFT OUTER JOIN 
            (   SELECT  id_users
                    ,   COUNT(*) as paiement 
                FROM    admin_historique
                WHERE   type_histo      = 'paye'
                GROUP BY    id_users
            )   AS paiement
            ON paiement.id_users = admin_users.id 
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Points : 120
    Points
    120
    Par défaut
    merci

    j'ai une erreur de syntaxe. Je vérifie d'où ça vient.

  10. #10
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Points : 120
    Points
    120
    Par défaut
    juste pour info, la version de mon serveur est la 4.0

  11. #11
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Citation Envoyé par bobic
    juste pour info, la version de mon serveur est la 4.0
    ...qui si je ne me trompe n'accepte pas les sous-requêtes.
    Dommage
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  12. #12
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Points : 120
    Points
    120
    Par défaut
    oui, c'est ce qu'il me semble....
    j'étais justement en train de chercher pour en être sur avant de dire une connerie !

    C'est pour ça que j'ai préféré le préciser

    Retour cas "après-départ)

  13. #13
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Citation Envoyé par bobic
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT admin_users.*, 
    sum(admin_historique.remuneration) as somme, 
    count(DISTINCT histo.ID) as paiement 
    FROM admin_users 
    LEFT OUTER JOIN admin_historique ON (admin_historique.id_users=admin_users.id and admin_historique.type_histo='insertion' AND admin_historique.valide_paiement='oui') 
    LEFT OUTER JOIN admin_historique histo ON ( histo.id_users = admin_users.id and histo.type_histo='paye') 
     
    GROUP BY admin_users.id
    Problème lorsque le count(DISTINCT histo.ID) as paiement =5 (par exemple), il me multiplie mon sum(....) par 5....
    En réfléchissant un peu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum(admin_historique.remuneration) / count(DISTINCT histo.ID) as somme
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  14. #14
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Points : 120
    Points
    120
    Par défaut
    heu.... oui exact, c'est un bidouillage tout con, mais qui marchera à coup sur

    merci

  15. #15
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Points : 120
    Points
    120
    Par défaut
    me voici de retour....

    Ce bidouillage ne fonctionne pas en fait....

    Parce que si count(DISTINCT histo.ID) as paiement est supérieur à 0, cela va, mais s'il est nulle, alors je me retrouve avec somme = 0 .....

    dur dur !

  16. #16
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 33
    Points : 36
    Points
    36
    Par défaut
    Là ça devrait marcher.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sum(admin_historique.remuneration) / CASE WHEN count(DISTINCT histo.ID) = 0 THEN 1 ELSE count(DISTINCT histo.ID) END
    Mais bon ça devient très lourd. Pourquoi ne pas tout simplement faire 2 requêtes qui te donnent les résultats que tu recherches séparément? Ou même une procédure stockée qui te permettra d'utiliser les tables temporaires pour les 2 résultats avant de les réunir comme bon te semble?

  17. #17
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Points : 120
    Points
    120
    Par défaut
    merci je vais essayer
    Pour répondre à ta question, j'y ai pensé.

    Mettre dans mon while (php) ma seconde requête serait bon.
    Mais je trouvais plus propre de tout faire en une seule requête en fait...

  18. #18
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Points : 120
    Points
    120
    Par défaut
    merci, cela fonctionne nickel ! Merci

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/10/2009, 08h48
  2. erreur dans une application avec BD mysql
    Par GoldenEyes dans le forum Ruby on Rails
    Réponses: 7
    Dernier message: 10/06/2009, 12h24
  3. récupérer le code d'erreur dans une procédure stockée MYSQL
    Par zephira dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 05/07/2008, 07h01
  4. #Erreur dans une requête avec une fonction personnalisée
    Par pguiheu dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 04/07/2006, 15h45
  5. erreur mysql-fetch_array dans une boucle While
    Par carmen256 dans le forum Requêtes
    Réponses: 2
    Dernier message: 13/04/2006, 17h15

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