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 :

Requête croisée entre deux tables


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Requête croisée entre deux tables
    Bonjour,

    J'ai tenté de trouver la solution moi même à mon problème, mais le message "Erreur dans l'exécution de la requête persiste"
    Je viens de lire plusieurs petit 'tutos' sur les jointures des tables mais je ne sais pas si c'est ce qu'il me faut pour résoudre mon problème...

    Je m'explique >

    Le projet : Un site pour un club de danse

    Sur ma page web, j'ai une liste de tous les membres inscrit dans le club.
    Avec au dessus de celle-ci une liste déroulante avec les différents cours (Filtre)
    je souhaite ainsi limiter ma requête sql et n'afficher que les membres inscrit au cours sélectionné.

    Les membres sont inséré dans un table : "l4d_membre"

    Une autre table est créée pour faire la liaison entre les membres et les cours : "l4d_participant_cours"
    Dans celle-ci, un colonne avec l'id du membre (membre_id) et l'id du cours (cours_id)

    Voici donc la requête que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT membre_id, nom, prenom,  date_naissance, email
    FROM l4d_membre
    WHERE membre_id = l4d_participant_cours.membre_id
    Déjà là, je n'arrive même pas à récupérer les membres qui sont bien dans les deux liste...
    Mais en plus, je souhaite précisez une seconde condition.
    Le membre dans être mentionné dans la table 'l4d_participant_cours' ok, mais il doit également être inscrit dans le cours sélectionne.
    Au final je veux afficher les informations des membres de ma table "l4d_membre" pour lequel leurs id sera sur le même ligne que l'id du cours de la table "l4d_participant_cours"

    J'espère ne pas avoir été trop brouillons dans mes explications.
    Si quelqu'un peut m'éclairer dans mes recherches, ca serais super

    Merci à tous.
    Laurent.

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 220
    Points : 28 201
    Points
    28 201
    Par défaut
    Tu n'as pas tout lu sur les jointures apparement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT membre_id, nom, prenom,  date_naissance, email
    FROM l4d_membre
    INNER JOIN l4d_participant_cours ON l4d_membre=l4d_participant_cours.membre_id
    INNER JOIN l4d_cours ON l4d_participant_cours.cours_id=l4d_cours.cours_id
    WHERE l4d_cours.cours_id= TonIdDeCours

    Et encore, si tu te base juste sur l'id cours, la seconde jointure n'est pas forcément nécessaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT membre_id, nom, prenom,  date_naissance, email
    FROM l4d_membre
    INNER JOIN l4d_participant_cours ON l4d_membre=l4d_participant_cours.membre_id
    WHERE l4d_participant_cours.cours_id= TonIdDeCours

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Waww

    Un grand merci Yves.

    Ben j'ai lu quelques trucs sur les jointures, mais quand j'ai testé j'avais toujours des messages d'erreurs, donc j'ai pensé que ce n'était pas ça qu'il me fallait.
    Mais c'est surtout parce que je ne savais pas trop comment l'utilisez et que j'utilisais mal le INNER JOIN.

    Maintenant avec ton exemple, déjà j'ai compris et en plus la requête fonctionne.

    J'ai juste du ajouter deux petites choses.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT l4d_membre.membre_id, nom, prenom,  date_naissance, email
    FROM l4d_membre
    INNER JOIN l4d_participant_cours ON l4d_membre.membre_id = l4d_participant_cours.membre_id
    WHERE l4d_participant_cours.cours_id = IdDeMonCours
    Pour ceux que ca pourras aidé, comme l'explication de Yves m'a bien aidé.
    Dans le SELECT, il y a un "membre_id" et le problème c'est que si je ne mentionnais pas de quel table il s'agit, j'avais un message de MySQL du type :

    Column 'membre_id' in field list is ambiguous

    J'ai donc juste spécifié dans quel table était le 'membre_id'.

    Merci encore Yves et un bon week-end.
    Laurent.

  4. #4
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 220
    Points : 28 201
    Points
    28 201
    Par défaut
    Tout à fait, petite erreur de ma part.

    A noter que la jointure utilisée ici est la jointure interne (d'où le INNER). Cette jointure est très rarement bien expliquée dans les écoles d'informatique quand elle est mentionnée.

    En fait elle est bien enseignée (le cours sur les jointure commence par elle en général), mais sous une forme différente et sous le terme simpliste de "Jointure".
    En école informatique, on t'aurait enseigné la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT l4d_membre.membre_id, nom, prenom,  date_naissance, email
    FROM l4d_membre,l4d_participant_cours
    WHERE l4d_participant_cours.cours_id = IdDeMonCours
    ou éventuellement, si les champs de jointure ne portaient pas le même nom, ou n'étaient pas les clés primaires de chaque table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT l4d_membre.membre_id, nom, prenom,  date_naissance, email
    FROM l4d_membre,l4d_participant_cours
    WHERE l4d_membre.membre_id = l4d_participant_cours.membre_id AND l4d_participant_cours.cours_id = IdDeMonCours
    On appelle ça une jointure implicite, parce que la jointure, bien que se faisant n'est pas clairement visible dans la requête.

    Personnellement, je milite pour le bannissement définitif de ce type de notation. Si sur une petite requête comme ici, ça reste encore lisible, sur des requêtes complexe faisant intervenir des 10ènes de tables, de vue, de sous-requêtes, etc ... ça devient très vite totalement illisible, incompréhensible, ingérable et en cas de bug, très difficile à corriger. Et je déteste plus que tout, dans cette notation, le fait de joindre les champs dans la clause Where. La clause Where sert à faire les filtres, elle n'est pas faite pour ça.

    Malheureusement, une très très grand quantité de profs (manquent-ils de l'expérience du terrain, sont-ils totalement déconnectés de la réalité ?) enseignent cette notation, faisant l'impasse ou ne passant que très rapidement sur l'autre notation, la seule qui devrait exister.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci encore pour tes précisions

    J'ai appris le PHP en cours du soir et nous n'avions pas eu l'occasion de parler des jointures.

    Pourtant, je trouve le sujet très important et surtout très pratique :p
    Je vais retenir la bonne méthode de la jointure interne

    Encore merci de m'avoir aidé à avancé dans mon projet.

    A bientôt.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Heu... Par contre, je me pose une question.

    Est-ce qu'il est possible de faire une requête avec jointure pour justement récupérer les membres qui ne sont inscrit dans aucuns cours??

    Quelques choses du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT l4d_membre.membre_id, nom, prenom,  date_naissance, email
    FROM l4d_membre
    INNER JOIN l4d_participant_cours ON l4d_membre.membre_id != l4d_participant_cours.membre_id
    WHERE l4d_membre.membre_id "n'est pas présent dans"  l4d_participant_cours.membre_id
    Je doit quand même utiliser un INNER JOIN pour ce type de requête?

  7. #7
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 220
    Points : 28 201
    Points
    28 201
    Par défaut
    Hum, dans ce cas, non, je ne partirais pas sur une jointure.

    Il existe une méthode (à supposer qu'elle soit supportée par ton sgbd) qui consisterait à assembler 2 requêtes (on parle de requêtes ensemblistes) avec l'opérateur EXCEPT. Je t'invite, si ça t’intéresse à te renseigner par toi-même.

    Personnellement, j'aurais plutôt tendance à choisir une seconde méthode qui est celle de la sous-requête. Le principe est simple, on fait une banale requête avec un filtre pour exclure certaines valeurs, sauf que ces valeurs à exclure vont être données par une seconde requête dite sous-requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT l4d_membre.membre_id, nom, prenom,  date_naissance, email
    FROM l4d_membre
    WHERE l4d_membre.membre_id NOT IN (
    	SELECT DISTINCT membre_id 
    	FROM l4d_participant_cours
    )

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Oulà...

    Heu... Mon sgbd? Heu, j'utilise phpMyAdmin via Wamp.
    C'est ca le sgbd? Désolé si la question peut paraitre très conne


    Concernant la dernière requête, je pensais pouvoir utiliser une 'jointure externe'.
    Car j'ai lu qu'elle prenais tout de même en compte les résultat qui n'était pas dans ma clause 'WHERE' et de là je pensais devoir appliquer un style de second filtre.

    Mais je vais lire ce que je trouve sur EXCEPT

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    D'après ce que je viens de lire, l'utilisation de EXCEPT dans mon cas est impossible, car les deux tables devant avoir le même
    schéma.

    Mais c'est certainement très pratique dans d'autres situation.

    J'en prends bonne note
    Tout comme ta solution avec le NOT IN et une sous-requête :p

    Merci encore Yves pour tes connaissances.

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

Discussions similaires

  1. [AC-2010] Relation croisée entre deux tables
    Par noratec dans le forum Modélisation
    Réponses: 5
    Dernier message: 11/10/2012, 15h38
  2. requête update entre deux tables
    Par evevev dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/03/2010, 19h21
  3. [AC-2003] Requête égalité entre deux tables non liées.
    Par Thotho-Maxime dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 28/07/2009, 09h14
  4. Requête sql entre deux tables
    Par jojo86 dans le forum Bases de données
    Réponses: 3
    Dernier message: 15/02/2008, 19h19
  5. [SELECT] sélection croisée entre deux tables
    Par WriteLN dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/03/2005, 11h05

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