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

PHP & Base de données Discussion :

SELECT imbriqué et jointure [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Inscrit en
    Août 2010
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 72
    Par défaut SELECT imbriqué et jointure
    Bonjour,
    Comment feriez-vous pour récupérer des champs de la table 'Porter'

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Pays_Nom
    FROM Pays LEFT JOIN Porter ON Pays.Pays_Code = Porter.Pays_code AND Porter.CRM_No=1
    WHERE Porter.Pays_Code is null;

    Merci

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    Comme ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
         Pays_Nom, Porter.*
    FROM 
         Pays LEFT JOIN Porter ON Pays.Pays_Code = Porter.Pays_code AND Porter.CRM_No = 1
    WHERE 
         Porter.Pays_Code IS NULL;

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2013
    Messages : 3
    Par défaut
    Ou comme ça:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
         *
    FROM 
         Pays, Porter 
    WHERE 
         Pays.Pays_Code = Porter.Pays_code AND 
         Porter.Pays_Code IS NULL AND 
         Porter.CRM_No = 1;

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    @janmaruku
    sûrement pas, on ne fait pas de jointures de tables dans la clause WHERE qui ne doit servir qu'au filtrage des données et à rien d'autre.
    Les jointures ne doivent être faites que dans la clause FROM prévue pour cela.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ça m'intéresse car Je les fais moi même quasiment tout le temps dans le where, cela change quoi concrètement en terme de traitement ?

  6. #6
    Membre confirmé
    Inscrit en
    Août 2010
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 72
    Par défaut
    Merci pour ces réponses.
    Je me suis donc inspiré des lignes ci-dessus pour écrire ça.
    Le problème est que ça me retourne des données fausses.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $query = mysql_query("SELECT lib_dga, dga, DGAA, sum(m.NB_TOT) as NB_TOT
    FROM structure as s LEFT JOIN m41000 as m ON s.dga = m.DGAA
    WHERE m.CCIBLE=0 and m.DRR='41270' and m.LIBELLE_ACTION='action1' GROUP BY s.dga, m.DGAA") or die (mysql_error());
    while($array = mysql_fetch_assoc($query))
    {	
    print $array['lib_dga'];echo "<br>";
    print $array['NB_TOT'];echo "<br>";
    }
    Les résultats de NB_TOT sont multipliés par 8.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2008
    Messages : 64
    Par défaut
    Salut,
    Qu'est ce qu'il y a dans ton champ "NB_TOT" de ta table m41000 ?

    Pour info, le "SUM" fait la somme sur tous les résultats retournés. Une piste qui peut t'aider : fais un tour sur la partie "GROUP BY" de la doc SQL

  8. #8
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    @dmcissokho

    un peu de lecture ici

  9. #9
    Membre éprouvé
    Inscrit en
    Décembre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2007
    Messages : 94
    Par défaut
    @tapi21
    Si tu ne spécifies pas le résultat escompté peu de gens seront motivés à t'aider. Tu pourrais par exemple poster la structure de tes tables.
    En passant je t'invite à adopter une nomenclature un peu plus explicite pour le libellé de tes tables.
    Cordialement

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    @dmcissokho

    un peu de lecture ici
    Merci !!!!!! ma formatrice avait été incapable de me donner cette différence

  11. #11
    Membre confirmé
    Inscrit en
    Août 2010
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 72
    Par défaut
    Merci de votre patience, je vais essayer d'être le plus précis possible. Je bute depuis plusieurs jours et et pense que la solution doit exister :
    Soit deux tables "structure" et "m41000".
    Les champs "dga" et "lib_dga" dans la table "structure" et les champs "DGAA", "NB_TOT", "DRR", "CCIBLE", "LIBELLE_ACTION" dans la table m41000.
    Les deux tables sont liées par les champs "dga" et "DGAA".
    Je souhaiterai faire la somme de tous les champs" NB_TOT" avec la condition WHERE et ne récupérer que les champs "lib_dga" correspondant aux champs "DGAA".
    J'ai écrit ça, mais le résultat est encore faux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $query = mysql_query("SELECT DISTINCT lib_dga, dga, DGAA, sum(NB_TOT) as NB_TOT FROM structure as s INNER JOIN m41000 as m ON s.dga=m.DGAA and m.CCIBLE=0 and m.DRR='41270' and m.LIBELLE_ACTION='CREDIT BAIL A ECHEANCE          '
    GROUP BY m.DGAA") or die (mysql_error());
    while($array = mysql_fetch_assoc($query))
    {	
    print $array['lib_dga'];echo "<br>";
    print $array['NB_TOT'];echo "<br>";
    }
    A vot' bon coeur.

  12. #12
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Toutes les colonnes du SELECT ne faisant pas l'objet d'une fonction de groupage doivent figurer dans le GROUP BY sous peine de voir des valeurs aléatoires pour les colonnes manquantes.

    Voici la requête récrite et corrigée :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT s.lib_dga, s.dga, m.DGAA, SUM(NB_TOT) AS NB_TOT
    FROM structure s
    INNER JOIN m41000 m ON s.gda = m.DGAA
    WHERE m.CCIBLE = 0
    	AND m.DDR = '41270'
    	AND m.LIBELLE_ACTION = 'CREDIT BAIL A ECHEANCE          '
    GROUP BY s.lib_dga, s.dga, m.DGAA
    Elle va donner la somme de NB_TOT par dga.
    D'ailleurs, s.dga et m.DGAA étant liés par une égalité dans la condition de jointure, à quoi sert de récupérer les deux informations qui sont par définition identiques ?

    mais le résultat est encore faux :
    Quel est le résultat attendu ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  13. #13
    Membre confirmé
    Inscrit en
    Août 2010
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 72
    Par défaut
    J'ai utilisé ton script (en modifiant deux petites fautes de frappe) et le résultat est toujours identique.
    Dans la table m41000 la valeur de NB_TOT pour les dga concernées (seulement 2) par la clause WHERE est de 1. Dans la table structure il existe 8 lignes pour une des dga et 7 pour l'autre (ces dga sont des unités mères avec 8 filles pour l'une et 7 pour l'autre). Et ce sont ces deux chiffres qui me sont restitués avec ce script.

  14. #14
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Bis repetita :
    Citation Envoyé par CinéPhil
    Quel est le résultat attendu ?
    Donne nous un jeu de données en entrée et le résultat attendu.

    Dans la table structure il existe 8 lignes pour une des dga et 7 pour l'autre (ces dga sont des unités mères avec 8 filles pour l'une et 7 pour l'autre). Et ce sont ces deux chiffres qui me sont restitués avec ce script.
    Donc si pour ces lignes NB_TOT = 1, il est bien normal que la somme de NB_TOT donne 8 et 7 !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  15. #15
    Membre confirmé
    Inscrit en
    Août 2010
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 72
    Par défaut
    Euréka, après des jours de recherches, j'ai trouvé ce script. En fin de compte mon problème devait venir du fait que des champs liés devraient porter le même nom (?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $query = mysql_query("SELECT DISTINCT s.lib_dga, s.DGAA, m.NB_TOT
    FROM structure as s INNER JOIN (SELECT DGAA, sum(NB_TOT) AS NB_TOT
    FROM m41000 as m WHERE m.CCIBLE = 0 AND m.DRR = '41270' AND m.LIBELLE_ACTION = 'ANNIVERSAIRE 12 ANS             ' 
    GROUP BY m.DGAA) m ON s.DGAA=m.DGAA;") or die (mysql_error());
    Merci à tous.

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

Discussions similaires

  1. [INSERT][SELECT] insert avec un select imbriqué
    Par narmataru dans le forum SQL
    Réponses: 11
    Dernier message: 06/03/2013, 03h04
  2. Jointure, index et select imbriqué
    Par Knonix dans le forum SQL
    Réponses: 8
    Dernier message: 03/07/2008, 18h25
  3. SELECT imbriqué ou jointure reflexive
    Par JauB dans le forum DB2
    Réponses: 8
    Dernier message: 31/01/2007, 18h57
  4. Requetes imbriquées et jointures
    Par Emile Le Tueur* dans le forum Requêtes
    Réponses: 4
    Dernier message: 31/03/2004, 23h12
  5. SYBASE SELECT imbriqué clause FROM
    Par Nicolas Martel dans le forum Sybase
    Réponses: 2
    Dernier message: 19/11/2003, 15h28

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