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 :

where sur une clé double


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club Avatar de restart
    Inscrit en
    Novembre 2009
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 84
    Points : 49
    Points
    49
    Par défaut where sur une clé double
    bonjour
    je voulais faire une requete qui me permet d'afficher tous les exemplaires d'un livre qui n'ont pas été emprunté
    ce qui me cause problème c'est que la condition where doit contenir une condition sur l'état d'une clé double
    je veux dire la clé (numinv,nce) de la table emprunter fait a partir des deux clé nce (numero de carte de l'étudiant ) et numinv (numero de l'exemplaire)
    ce que j'ai penser a faire c'est comme suit :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select distinct exemplaire.numinv,exemplaire.code_livre,livre.titre,livre.themes 
    from livre
    inner join exemplaire on exemplaire.code_livre=livre.code_livre
    inner join emprunter on emprunter.numinv=exemplaire.numinv
    inner join etudient on etudient.nce=emprunter.nce
    where etudient.nce not in (emprunter.nce);
    cette requête donne une table vide
    j'ai essayer d'utiliser la condition exemplaire.numinv not in (emprunter.numinv)
    mais ça donne aussi une table vide
    es ce que quelqu'un pourrais me donner un idée pour mieux filtrer les choses
    merci

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    afficher tous les exemplaires d'un livre qui n'ont pas été emprunté
    Apparemment, les exemplaires empruntés figurent dans la table 'emprunter'.
    Cette table contient-elle l'historique des emprunts ou seulement les emprunts en cours ?

    Dans les deux cas, inutile d'aller jusqu'à l'étudiant (et pas etudient au passage ! ).

    Si la table ne contient pas d'historique, deux requêtes sont possibles :
    1) Une jointure externe des exemplaires vers les emprunts et on cherche les NULL dans les emprunts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT ex.numinv, ex.code_livre, l.titre, l.themes 
    FROM livre AS l
    INNER JOIN exemplaire AS ex ON ex.code_livre = l.code_livre
      LEFT OUTER JOIN emprunter AS em ON em.numinv = ex.numinv
    WHERE em.numinv IS NULL
    2) On teste la non existence de l'exemplaire dans les emprunts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT ex.numinv, ex.code_livre, l.titre, l.themes 
    FROM livre AS l
    INNER JOIN exemplaire AS ex ON ex.code_livre = l.code_livre
    WHERE NOT EXISTS (
      SELECT *
      FROM emprunter AS em
      WHERE em.numinv = ex.numinv
    )
    S'il y a beaucoup de données, la seconde peut être plus rapide parce que la recherche de l'existence devrait s'arrêter dès qu'elle est trouvée alors que la première requête va faire toute la jointure.

    Si la table contient l'historique des emprunt, elle doit contenir une colonne permettant de savoir si l'exemplaire a été rendu (une date de retour par exemple).
    Il faudrait davantage préciser la structure des tables pour fournir une réponse plus complète.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  3. #3
    Membre du Club Avatar de restart
    Inscrit en
    Novembre 2009
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 84
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Apparemment, les exemplaires empruntés figurent dans la table 'emprunter'.
    Cette table contient-elle l'historique des emprunts ou seulement les emprunts en cours ?

    Dans les deux cas, inutile d'aller jusqu'à l'étudiant (et pas etudient au passage ! ).
    la table emprunter contient juste le numinv (numéro de l'exemplaire), nce(numéro de carte de l'etudient), dateempr(date de l'emprunt) et la durée
    en fete j'ai pris l'habitude d'écrire etudient et pas étudiant (erreur que j'ai toujours pas su corrigé)


    Citation Envoyé par CinePhil Voir le message

    1) Une jointure externe des exemplaires vers les emprunts et on cherche les NULL dans les emprunts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT ex.numinv, ex.code_livre, l.titre, l.themes 
    FROM livre AS l
    INNER JOIN exemplaire AS ex ON ex.code_livre = l.code_livre
      LEFT OUTER JOIN emprunter AS em ON em.numinv = ex.numinv
    WHERE em.numinv IS NULL
    ce code marche convenablement
    joli travail !!!!!
    mais je comprend pas la commande left join ici
    j'ai toujours utiliser inner join
    mais left join je connais pas
    c'est quoi la différence entre inner join et left join svp

    Citation Envoyé par CinePhil Voir le message
    2) On teste la non existence de l'exemplaire dans les emprunts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT ex.numinv, ex.code_livre, l.titre, l.themes 
    FROM livre AS l
    INNER JOIN exemplaire AS ex ON ex.code_livre = l.code_livre
    WHERE NOT EXISTS (
      SELECT *
      FROM emprunter AS em
      WHERE em.numinv = ex.numinv
    )
    S'il y a beaucoup de données, la seconde peut être plus rapide parce que la recherche de l'existence devrait s'arrêter dès qu'elle est trouvée alors que la première requête va faire toute la jointure.
    tu as raison
    celle la est la plus rapide

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    INNER JOIN est une jointure interne. On va joindre seulement les lignes des deux tables qui satisfont la condition de jointure.
    LEFT OUTER JOIN est une jointure externe à gauche. On va garder toutes les lignes de la table à gauche de LEFT OUTER JOIN et donner la correspondance quand elle existe dans la table à droite de LEFT OUTER JOIN. Si la correpondance n'existe pas, les colonnes de la table de droite afficheront NULL.
    Rechercher ces NULL revient à ne garder que les lignes de la table de droite qui n'ont pas de correspondance.

    On a parfois besoin d'utiliser son pendant RIGHT OUTER JOIN qui va garder toutes les lignes de la table de droite et donner la correspondance si elle existe dans la table de gauche ou NULL.

    Plus d'inforations sur les jointures dans le tutoriel de SQLPro.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

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

Discussions similaires

  1. comment appliquer une condition where sur une datagridview
    Par moha1984 dans le forum Windows Forms
    Réponses: 11
    Dernier message: 07/08/2008, 20h02
  2. [MySQL] WHERE sur une partie de variable
    Par nicoxweb dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 04/10/2007, 23h37
  3. Réponses: 3
    Dernier message: 19/06/2007, 22h34
  4. [MySQL] Clause WHERE sur une liste et jeu de caractère
    Par napz dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/10/2006, 13h03
  5. Clause Where sur une Date
    Par Zebulonn dans le forum Installation
    Réponses: 31
    Dernier message: 20/10/2005, 11h56

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