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 :

Joindre résultat requête sur une table à une autre table.


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    bibliothécaire
    Inscrit en
    Septembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : bibliothécaire
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2012
    Messages : 27
    Points : 20
    Points
    20
    Par défaut Joindre résultat requête sur une table à une autre table.
    Bonjour.

    Je débute un peu avec le sql et le problème c'est que je n'ai pas encore le vocabulaire pour poser correctement les questions. J'utilise phpmyadmin.

    Dans ma base deux tables sont en relation que je veux "joindre" dans le résultat de ma requête. La table exemplaires et la table notices.

    Je lance cette requête sur la table exemplaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM `exemplaires` 
    WHERE `expl_owner` =1 
      AND `last_loan_date` <>0000-00-00
    Le résultat qui m'est affiché me donne des informations de la table exemplaires seulement. Or, je voudrais que des informations de la table notice (le champ tit1) viennent compléter le résultat de ma requête.

    Le champ expl_notice dans la table exemplaires a les mêmes numéros que notice_id dans la table notices. Je pense que la relation se fait là-dessus.

    Merci.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut, en effet dans ta requête sql il te manque la jointure. Tu devrais faire un tour du coté des tuto sql sur les jointures INNER/LEFT/RIGHT/FULL JOIN...
    http://sqlpro.developpez.com/cours/sqlaz/jointures/

    Ta requête devrait ressembler à un truc dans ce style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * 
    FROM exemplaires E
    INNER JOIN notice N ON N.notice_id = E.expl_notice
    WHERE `expl_owner` =1 AND `last_loan_date` <> 0000-00-00
    le "E" majuscule et le "N" sont des alias , ça te permet d’appeler les champs colonnes de ta table sans qu'il y est de confusion avec les autres tables.

    Pour finir au lieu de ton "SELECT *" tu peux appeler seulement les champs colonnes dont tu as besoin. (les champs colonnes des 2 tables bien sur)
    Dernière modification par Invité ; 11/11/2012 à 19h51.

  3. #3
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Pour compléter et corriger légèrement ce qu'a dit boboash :
    Les champs sont à la campagne ou dans les formulaires, pas dans les tables SQL qui ne sont composées que de lignes et de colonnes !

  4. #4
    Membre à l'essai
    Homme Profil pro
    bibliothécaire
    Inscrit en
    Septembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : bibliothécaire
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2012
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Voilà la requête que j'ai tapée et qui fonctionne.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT `expl_cote` as COTE, `expl_cb` as CODE_BARRES, `expl_lastempr` as LECTEURS, `tit1` as TITRE
    FROM `exemplaires` 
    INNER JOIN notices ON notices.notice_id = exemplaires.expl_notice
    WHERE `expl_lastempr` =0
    AND `expl_owner` =1


    Je n'ai pas réussi à utiliser les renoms. Mauvaise syntaxe et j'ai pas eu le temps de chercher. Ça a été long parce que j'ai confondu les ` et les '
    Et puis j'ai reformulé ma requête pour faire la recherche sur une autre colonne et avoir un affichage plus "lisible".

    Merci à vous et merci pour le tutoriel.

  5. #5
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Je n'ai pas réussi à utiliser les renoms.
    Je suppose que tu veux parler des alias mentionnés par boboash ?

    C'est pas compliqué !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT [alias_table_1].colonne_table_1
    FROM table_1 [alias_table_1]
    INNER JOIN table_2 [alias_table_2] ON [alias_table_2].colonne_table_2 = [alias_table_1].colonne_table_1
    Et bien sûr, on utilise des alias les plus courts possibles mais de préférence mnémotechniques pour rappeler quand même la table sinon ça ne sert à rien.

    Ça a été long parce que j'ai confondu les ` et les '
    En l'occurrence, puisque tes tables et colonnes sont correctement nommées, tu peux supprimer ces saloperies d'apostrophes inversées pénibles à écrire.

    Je te recommande aussi d'aérer et d'indenter correctement ton code, ça facilite la lecture et le débogage éventuel.

    Voici ta requête récrite, en ayant fait des suppositions sur la provenance des colonnes :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT e.expl_cote AS COTE,
    	e.expl_cb AS CODE_BARRES,
    	e.expl_lastempr AS LECTEURS,
    	n.tit1 AS TITRE
    FROM exemplaires e
    INNER JOIN notices n ON n.notice_id = e.expl_notice
    WHERE e.expl_lastempr = 0
    	AND e.expl_owner = 1

  6. #6
    Membre à l'essai
    Homme Profil pro
    bibliothécaire
    Inscrit en
    Septembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : bibliothécaire
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2012
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Bonjour.

    C'est bizarre. Dans ma requête
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT 
    e.expl_cote AS COTE, 
    e.expl_owner as PROPRIO, 
    e.expl_cb AS CODE_BARRES, 
    e.last_loan_date as DATE_PRET , 
    n.tit1 AS TITRE
    FROM exemplaires e
    INNER JOIN notices n ON n.notice_id = e.expl_notice
    WHERE e.expl_owner =1 AND e.last_loan_date =0000 -00 -00 OR e.last_loan_date IS NULL
    ORDER BY e.expl_cote

    J'ai, dans mon résultat, des PROPRIO qui ont pour valeur 2 alors que je demande égal à 1.

    J'ai testé la même requête en enlevant
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    OR e.last_loan_date IS NULL
    et cette fois-ci le résultat est bon. C'est donc le OR qui pose problème.

  7. #7
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Je ne sais pas si c'est dû à ça mais tu as une erreur ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND e.last_loan_date =0000 -00 -00
    Les dates s'écrivent entre apostrophes !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND e.last_loan_date = '0000-00-00'
    De plus, quand on mélange AND et OR, il faut utiliser les parenthèses pour prioriser les opérateurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WHERE e.expl_owner =1
    	AND
    	(
    		e.last_loan_date = '0000-00-00'
    		OR e.last_loan_date IS NULL
    	)

  8. #8
    Membre à l'essai
    Homme Profil pro
    bibliothécaire
    Inscrit en
    Septembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : bibliothécaire
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2012
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Je viens de mettre les parenthèses et le ça fonctionne bien.
    Ça donne :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
    e.expl_cote AS COTE, 
    e.expl_owner AS PROPRIO, 
    e.expl_cb AS CODE_BARRES, 
    e.last_loan_date AS DATE_PRET, 
    n.tit1 AS TITRE
    FROM exemplaires e
    INNER JOIN notices n ON n.notice_id = e.expl_notice
    WHERE e.expl_owner =1
    AND (e.last_loan_date =0000 -00 -00 OR e.last_loan_date IS NULL)
    ORDER BY e.expl_cote

    Merci.

  9. #9
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Pourquoi as-tu toujours ta date sans apostrophes ?
    Je me demande comment cette requête peut fonctionner !

  10. #10
    Membre à l'essai
    Homme Profil pro
    bibliothécaire
    Inscrit en
    Septembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : bibliothécaire
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2012
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Avec ou sans les apostrophes ça fonctionne et ça me donne le même résultat.
    Je vais quand même les mettre.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/12/2013, 10h08
  2. Réponses: 4
    Dernier message: 05/11/2007, 10h33
  3. Réponses: 4
    Dernier message: 06/03/2007, 12h00
  4. [modélisation]Table liée à l'une ou l'autre table
    Par gedeon555 dans le forum Schéma
    Réponses: 1
    Dernier message: 11/10/2006, 22h56
  5. language SQL - Copier une ligne dans autre table
    Par fxd dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/10/2005, 18h16

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