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 :

Select avec jointure ?


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut Select avec jointure ?
    Bonjour,

    J'ai une table 'membre', dans laquelle il y a 5 champs favoris : fav_1, fav_2, fav_3, etc.. Ces champs sont des entiers. Par défaut le champ est égal à 0.

    J'ai une seconde table 'identification', et je souhaiterais faire un select dessus en utlisant les champs favoris de la table 'membre', en écartant ceux qui sont égaux à 0.

    Je fais donc un 1er select pour sélectionner pour mettre mes champs favoris dans un tableau comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Pour récupérer les favoris en rapport avec l'id_membre
    $resultat = mysql_query("SELECT fav_1, fav_2, fav_3, fav_4, fav_5
    FROM membre WHERE id_membre = '$id_membre'" );
     
    $row =  mysql_fetch_array($resultat);
    Et maintenant je voudrais faire mon 2ème select en 'balayant' les valeurs du tableau obtenu de $row[0] à $row[4] en testant si ces valeurs sont différentes de 0 et en les attribuant à id_fiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // Pour afficher
    $sql = mysql_query("SELECT id_fiche, nom, adresse, code_postal FROM identification
    WHERE $row[0] = id_fiche, $row[1] = id_fiche, etc....");
    Je suis débutant je ne sais pas comment faire...

    Peut-être avec une jointure ?

    Merci de votre aide

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 109
    Points : 28 436
    Points
    28 436
    Par défaut
    Citation Envoyé par pasc06 Voir le message
    je ne sais pas comment faire...
    Citation Envoyé par Boileau
    Ce qui se conçoit bien s'énonce clairement...
    ... et je n'ai compris ce que tu voulais faire.
    Peut-être qu'en présentant un exemple et en limitant le code au seul SQL ?

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut Explication
    Bin en fait j'ai 2 tables : membre et identification

    Dans la table 'membre', l'utilisateur peut mémoriser en favori jusqu'à 5 numéros de fiche (champs de fav_1 à fav_5). Par défaut ces champs sont égaux à 0.

    Je souhaiterais afficher les détails des 5 fiches mémorisées de la table 'membre'. Ces détails se trouvent dans la table 'identification'. Dans celle-ci il y a également un champ 'actif', qui détermine si la fiche est active ou non (0 ou 1).

    Il faudrait donc faire un select sur la table 'identification' en utilisant les valeurs fav_1 à fav_5 de la table 'membre' et en les attribuant au champ 'id_fiche' de la table 'identification', tout en excluant les valeurs 'fav_x' qui sont égales à 0 et les fiches qui ne sont pas actives.

    Je pense qu'il faut faire une jointure dans le select, mais je suis débutant et je ne sais pas comment faire !

    Je vais essayer cela pour le champ fav_1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sql = mysql_query("SELECT id_fiche, nom, adresse, code_postal
    FROM identification, membre WHERE identification.actif = 1
    AND identification.id_fiche = membre.fav_1
    AND membre.fav_1 != 0");
    Cela vous semble t'il correct ? Comment faire pour les 4 autres champs 'fav_' ?

    Merci de votre aide

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Déjà, il y a une erreur de conception !
    Si plus tard, tu veux augmenté le nombre de favoris, tu vas augmenter le nombre de colonnes ?

    MCD Merise :
    Membre -0,n----Avoir favori----0,n- Identification

    Tables qui en découlent :
    membre(id_membre, ...)
    identification(id_fiche, nom, adresse, code_postal, actif...)
    favoris(id_membre, id_fiche)

    Ensuite c'est ton interface utilisateur en php qui limite le nombre de favoris à 5 par membre. On peut aussi mettre une contrainte en base de données mais bon, si tu débutes, c'est peut-être un peu compliqué pour toi.

    Prends l'habitude d'écrire les jointures normalisées avec JOIN. Une requête pour trouver les favoris d'un membre (n° 1056) avec le modèle de données ci-dessus serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT i.id_fiche, i.nom, i.adresse, i.code_postal
    FROM identification i
    INNER JOIN favoris f ON i.id_fiche = f.id_fiche
    WHERE f.id_membre = 1056 AND i.actif = 1

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Vous pouvez utiliser plusieurs fois la même table dans une requête, il suffit de lui donner des alias différents.

    Je vous conseille aussi de faire des jointures externes.

  6. #6
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut CinePhil
    Merci CinePhil

    A quoi correspondent les i et les f ?

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Ce sont des alias qui permettent d'éviter de réécrire le nom de la table.
    Un truc de fainéant quoi !

    Être fainéant, ça rend intelligent !

  8. #8
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut ok
    Cool pour les alias si ça marche en effet !

    Tu ecris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INNER JOIN favoris f ON i.id_fiche = f.id_fiche
    Je n'ai pas de champ 'id_fiche' dans ma table 'membre', mais 5 champs (fav_1, fav_2, etc)

    Il semble que ta requête ne prennent pas en compte ces 5 champs...

    A noter que la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sql = mysql_query("SELECT id_fiche, identification.nom, identification.adresse,
    identification.code_postal
    FROM identification, membre WHERE identification.actif = 1
    AND identification.id_fiche = membre.fav_1
    AND membre.fav_1 != 0");
    fonctionne correctement, mais évidemment uniquement sur le champ fav_1....

  9. #9
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut Essai
    La requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql = 'SELECT id_fiche, i.nom, i.adresse, i.code_postal
    FROM identification i INNER JOIN membre m ON i.id_fiche = m.fav_1
    WHERE i.actif = 1 AND m.fav_1 != 0';
    Fonctionne également, mais évidemment toujours uniquement sur le champ fav_1...

    Comment l'étendre aux 4 autres champs 'fav_' ?

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Tu as lu l'intégralité de mon message ?
    Ma requête est basée sur le modèle de données que je préconisais.
    Tu ne peux pas toucher au modèle ?
    Ca demanderait trop de boulot de reprendre tous les programmes qui font appel à cette partie de ta structure ?

  11. #11
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut Bin...
    Bin il est clair que j'aimerais autant conserver la structure existante et étendre la requête aux 4 autres champs 'fav_'...

    Est-ce possible ?

    Si ça ne l'est pas évidemment je créérais une table 'favoris' comme tu l'as préconisé, mais bon... Je suis fainéant !

  12. #12
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut Hiiiiiiiiiiiiiiii
    Je viens de me rendre compte que dans la requête, le champ 'id_membre' de la table 'membre' n'était pas indiqué ! Ca fait que si j'ai un 2ème membre avec des favoris ça m'affiche aussi les favoris de ce 2ème membre !

    Voici donc la requête modifiée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql = 'SELECT id_fiche, i.nom, i.adresse, i.code_postal
    FROM identification i INNER JOIN membre m ON i.id_fiche = m.fav_1
    WHERE m.id_membre = '.$id_membre.' AND i.actif = 1 AND m.fav_1 != 0';

  13. #13
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Alors il faut se tourner vers la préconisation de Waldar...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT i1.id_fiche AS id_fiche1, i1.nom AS nom_fav1, i1.adresse AS adresse_fav1, i1.code_postal AS code_postal_fav1
      i2.id_fiche AS id_fiche2, i2.nom AS nom_fav2, i2.adresse AS adresse_fav2, i2.code_postal AS code_postal_fav2
    ...
    FROM membre m  
    LEFT JOIN identification i1 ON i1.id_fiche = m.fav_1 AND i1.actif = 1
    LEFT JOIN identification i2 ON i2.id_fiche = m.fav_2 AND i2.actif = 1
    ...
    Ca multiplie le nombre de colonnes retournées et c'est moins pratique à gérer ?
    Ben ouais ! C'est la conséquence d'un mauvais modèle !

    Voilà une fainéantise qui ne paie pas !

  14. #14
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut Ouch...!
    D'autant que pour l'énoncé je n'ai pas indiqué tous les champs de la table 'identification', et que j'ai jusqu'à... 20 favoris dans la table 'membre' !

    Je vais donc essayer de créer une nouvelle table 'favoris'...

    Merci Cinephil pour ton aide !

    Si en attendant quelqu'un a une autre proposition pour étendre la requête aux autres champs 'fav_' elle sera la bienvenue !

  15. #15
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par pasc06 Voir le message
    D'autant que pour l'énoncé je n'ai pas indiqué tous les champs de la table 'identification', et que j'ai jusqu'à... 20 favoris dans la table 'membre' !
    Vous prenez bien conscience qu'il y a une erreur de conception ?

  16. #16
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut Bin...
    Bin oui et non !

    Je débute je suis nul en analyse...

    Je suis en train de faire avec une nouvelle table 'favoris'...

  17. #17
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut La solution
    Ca y est ça marche !

    J'ai donc fait comme tu m'avais dit :

    j'ai créé une nouvelle table 'favoris' et je fais la requête que tu m'avais conseillée.

    Merci de ton aide Cinephil !

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

Discussions similaires

  1. Requete SELECT avec jointures
    Par escteban dans le forum Requêtes
    Réponses: 10
    Dernier message: 18/04/2007, 12h16
  2. [HQL] Select avec jointure
    Par jeoff dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/11/2006, 12h12
  3. [c#]commande Select avec jointure de deux tables
    Par chorokari dans le forum Accès aux données
    Réponses: 6
    Dernier message: 18/10/2006, 14h47
  4. Delete + selection avec jointure
    Par kluh dans le forum Oracle
    Réponses: 4
    Dernier message: 15/11/2005, 10h44
  5. Problème performance SELECT avec jointure
    Par Netgamer dans le forum Requêtes
    Réponses: 7
    Dernier message: 05/08/2005, 10h20

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