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 :

Requete avec jointure qui marche pas


Sujet :

Langage SQL

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut Requete avec jointure qui marche pas
    Bonnjour,

    Soit une table session (instance d'une formation) et une table creneaux indiquant les differentes tranches horaire durant lesquels se dérouleront la formation.

    La table creneaux reçoit donc une clé étrangère vers session qui peut donc avoir 0, 1, ou plusieurs creneaux.

    Le but du jeu est de selectionner les enregistrements de la table session qui ne sont pas appeler dans la creneaux.

    J'ai donc tout naturelement tapé la requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select session.id_session, session.effectif_session, matiere.nom_matiere, matiere.id_matiere, formation.titre_formation, formation.id_formation 
    from `session`, `formation`, `matiere` 
    left join `creneaux` on ( session.id_session = creneaux.session_creneaux ) 
    where creneaux.id_creneaux is NULL 
    and formation.id_formation = session.formation_session and matiere.id_matiere = formation.matiere_formation and creneaux.session_creneaux = session.id_session
    Pour le résultat suivant :

    Champ 'session.id_session' inconnu dans on clause
    Le résultat reste invariablement le meme si j'utilise ou non des alias, et j'ai vérifier et revérifier le nom des tables et des champs...

    Quelqu'un pourrait m'éclairer sur ce problème ? Y a t-il des problèmes de portées avec les noms de variables dans le cas des JOIN ?

    Pour info, j'utilise MySQL v.5.0.22

  2. #2
    Membre averti Avatar de Shivaneth
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 349
    Points : 341
    Points
    341
    Par défaut
    Bonjour,

    c'est peut être une question idiote mais t'as essayé sans mettre le session devant session_id ?

    Et pourquoi tes noms de tables sont entre " ' " ? T'es sous mysql ?

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Merci pour cette réponse fulgurante !
    Voila, c'est testé :

    Champ 'id_session' inconnu dans on clause
    Donc ca marche pas

    Edit : juste pour info, voici la documentation que j'utilise...

  4. #4
    Membre averti Avatar de Shivaneth
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 349
    Points : 341
    Points
    341
    Par défaut
    Il me semble que tu dois inverser les champs, je mettrais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LEFT JOIN `creneaux` ON session_creneaux = session.id_session

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    A vrai dire, ma 1er tentative était bien celle-ci... L'ordre est inversé suite a mes diférents tests...

    Le résultat reste bien le meme si je ré-inverse l'ordre

  6. #6
    Membre averti Avatar de Shivaneth
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 349
    Points : 341
    Points
    341
    Par défaut
    Et si tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT session.id_session, session.effectif_session, matiere.nom_matiere, matiere.id_matiere, formation.titre_formation, formation.id_formation 
    FROM `session`, `formation`, `matiere` 
    WHERE NOT EXISTS (SELECT * from `creneaux` WHERE session.id_session = session_creneaux )
    AND formation.id_formation = session.formation_session AND matiere.id_matiere = formation.matiere_formation

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Ca a effectivement l'air de fonctionner... Mais on m'a toujours dit que si on met un select dans un select, c'est qu'on doit pouvoir repenser le probleme plus intelligeament :p

    Je veux pas faire le puriste zélé, mais je vais quand même attendre de voir si je trouve une explication au problème de base avant de mettre résolu.

    Je te remercie en tout cas pour ton coup de main

  8. #8
    Membre averti Avatar de Shivaneth
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 349
    Points : 341
    Points
    341
    Par défaut
    Tu n'as pas répondu à ma question :
    Citation Envoyé par Shiva Skunk Voir le message
    Et pourquoi tes noms de tables sont entre " ' " ? T'es sous mysql ?
    ça pourrait venir de là non ?

  9. #9
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    et en faisant toutes les jointures avec des join ?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT session.id_session, session.effectif_session, matiere.nom_matiere, matiere.id_matiere, formation.titre_formation, formation.id_formation 
    FROM session 
    JOIN  formation ON formation.id_formation = session.formation_session 
    JOIN matiere ON matiere.id_matiere = formation.matiere_formation 
    LEFT JOIN creneaux ON session.id_session = creneaux.session_creneaux  
    WHERE creneaux.id_creneaux IS NULL

  10. #10
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Joli ! ça marche ! Tu penses que ça vient d'un problème entre l'utilisation de relations direct et de jointures ?

    En tout cas, merci à vous !

    PS : les ` protegent effectivement les noms de table qui pourraient etre des mots clef (genre si t'as une table case ou select ^^). Je suis efectivement sous mysql 5.

  11. #11
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    il est tout d'abord conseillé de faire les jointures avec un join, la tu mélanges un peu les 2 possibilités donc ca ne fait pas tres joli

    A mon avis, si tu fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM  `formation`, `matiere` ,`session`
    LEFT JOIN `creneaux` ON ( session.id_session = creneaux.session_creneaux )
    ca devrait marcher (à tester)

    mais c'est tout de meme moins lisible

    A+

    Michel


    PS :
    PS : les ` protegent effectivement les noms de table qui pourraient etre des mots clef (genre si t'as une table case ou select ^^). Je suis efectivement sous mysql 5.
    ca serait de toute facon une tres mauvaise idée de prendre comme nom de table ou de colonne un mot clé...

  12. #12
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Je comprend pas très bien le dernier message... Tu veux dires enlever les condition d'apres pour faire les liaison session-formation-matiere ?

    Si c'est le cas, matiere et formation ne devraient plus etre dans le FROM...

    Sinon, j'avais quand meme fait le test d'enlever toutes les autres conditions, mais l'erreur restait la meme (sans toucher au FROM)

  13. #13
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    non je veux dire que si tu changes l'ordre des tables dans le from, ca devrait fonctionner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select session.id_session, session.effectif_session, matiere.nom_matiere, matiere.id_matiere, formation.titre_formation, formation.id_formation 
    from  `formation`, `matiere`, `session`
    left join `creneaux` on ( session.id_session = creneaux.session_creneaux ) 
    where creneaux.id_creneaux is NULL 
    and formation.id_formation = session.formation_session and matiere.id_matiere = formation.matiere_formation and creneaux.session_creneaux = session.id_session

  14. #14
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    En effet ! bien jouer ^^

    En revanche, ma requete ne me retourne pas derésultats, mais ça, c'est un autre problème ^^

    Encore merci !

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

Discussions similaires

  1. [Débutant] cas test avec "ga" qui marche pas
    Par membreComplexe12 dans le forum MATLAB
    Réponses: 3
    Dernier message: 05/08/2013, 15h28
  2. [AC-2007] Requete avec jointure gauche ne marche pas
    Par jean-didier dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 11/01/2012, 18h05
  3. requête avec paramètre qui marche pas
    Par funkyjul dans le forum VBA Access
    Réponses: 7
    Dernier message: 18/04/2008, 13h37
  4. [SQL] Jointure,Group BY et ORDER BY COUNT qui marche pas
    Par Stef784ever dans le forum Langage SQL
    Réponses: 8
    Dernier message: 17/08/2005, 12h28
  5. requete(jointure 2 tables) qui marche pas
    Par DaxTaz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/06/2004, 17h50

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