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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    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 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    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 143
    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 ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 818
    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
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 454
    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 éclairé
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Par défaut CinePhil
    Merci CinePhil

    A quoi correspondent les i et les f ?

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 818
    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 !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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. 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