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 :

Jointure externe pour rechercher des contacts


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 29
    Points : 9
    Points
    9
    Par défaut Jointure externe pour rechercher des contacts
    Bonjour,
    J'ai 2 tables:
    - 1 table "membres": avec l 'id du membre, son prénom, son nom, son email....etc
    - 1 table "contacts" qui gère les relations entre les membres , avec l'id unique de la relation (id), l'id du membre suiveur(id_contact_suiveur) et l'id du membre suivi (id_contact_suivi)

    La relation entre les 2 tables est l'id des membres(id du membre dans a table membre, id_contact_suiveur et id_contact_suivi dans la table contacts)

    Pour les membres le but serait d'avoir la possibilité de suivre des personnes.

    J'essaye d'effectuer une jointure pour afficher tous les membres qui ne sont pas déjà suivi par l'utilisateur, mais je n'y arrive pas...

    J'ai déjà effectué des jointures qui fonctionnent mais là je suis bloqué.

    Voici mon code qui n'affiche qu'un seul membre (et qui est l'utilisateur connecté qui est lui même suivi par un autre utilisateur!!!!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    "SELECT membres.*, contacts.* 
    FROM membres 
    INNER JOIN contacts 
      ON contacts.id_contact_suivi=membres.id 
    WHERE contacts.id_contact_suiveur !=".$_SESSION['id']

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ce n'est pas une jointure qu'il te faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT membres.*, contacts.* FROM membres
    WHERE membres.id NOT IN (SELECT id_contact_suivi FROM contacts WHERE id_contact_suiveur = $_SESSION['id'])

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 29
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup pour la réponse!!!
    J'ai un message d'erreur qui s'affiche je pense que je dois mal écrire ma requête (notamment la parenthèse qui doit fermer après SELECT id_contact_suivi....
    Call to a member function fetch() on boolean

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $reponse=$bdd->query("SELECT membres.*, contacts.* FROM membres.id (SELECT id_contact_suivi FROM contacts WHERE id_contact_suiveur =." $_SESSION['id']));
         while ($resultat=$reponse->fetch())
           {
    	 echo $resultat['id']." ".$resultat['email']." nom: ".$resultat['nom']." prenom: ".$resultat['prenom']."<br>";
    		}
    		?>

  4. #4
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Il manque WHERE membres.id NOT IN dans ta requête.

    Juste par curiosité essaie :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "SELECT membres.*, contacts.* 
    FROM membres 
    INNER JOIN contacts ON contacts.id_contact_suivi=membres.id AND contacts.id_contact_suiveur !=".$_SESSION['id']

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Tu ne sais pas faire un copier-coller ?

    Il en manque un bout...

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 29
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par badaze Voir le message
    Il manque WHERE membres.id NOT IN dans ta requête.

    Juste par curiosité essaie :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "SELECT membres.*, contacts.* 
    FROM membres 
    INNER JOIN contacts ON contacts.id_contact_suivi=membres.id AND contacts.id_contact_suiveur !=".$_SESSION['id']
    En faisant cette requête j'ai qu'un contact qui apparaît

  7. #7
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Un conseil : fais d'abord fonctionner ta requête hors PHP (dans PhpMyAdmin, SqlDevelopper ou quelque soit l'outil que tu utilises pour administrer ta base) et ensuite intègre-la dans ton script.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 345
    Points : 39 743
    Points
    39 743
    Billets dans le blog
    9
    Par défaut
    Un autre conseil, remplacez les deux select * par la liste des colonnes utiles à votre besoin !
    LES SELECT * SONT TRES SOUVENT INTERDITS EN PRODUCTION

    Et même quand ce n'est pas le cas, c'est dangereux et contre performant

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 902
    Points : 51 646
    Points
    51 646
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Ce n'est pas une jointure qu'il te faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT membres.*, contacts.* FROM membres
    WHERE membres.id NOT IN (SELECT id_contact_suivi FROM contacts WHERE id_contact_suiveur = $_SESSION['id'])
    mais si :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT membres.*
    FROM   membres
           LEFT OUTER JOIN contacts
                ON membres.id = contact.id_contact_suivi AND 
                   id_contact_suiveur = $_SESSION['id']
    WHERE  contacts.id_contact_suivi IS NULL;
    Cela s’appelle la semi-anti jointure...

    Apprenez le SQL... Mon site web comme mes bouquins peuvent vous y aider !

    A +

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    moi, j'aurais dit comme sabotage... (j'ai déjà utilisé cette syntaxe)

    Mais l'autre syntaxe est bien aussi.
    Peut-être moins intuitive ?


    N.B. Je crois que c'est id_contact_suivi = $_SESSION['id'] au lieu de suiveur.
    Mais là, les explications n'étaient pas très claires.

  11. #11
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 345
    Points : 39 743
    Points
    39 743
    Billets dans le blog
    9
    Par défaut
    La solution la plus classique pour ce genre de besoin, est l'utilisation de NOT EXISTS

    NOT INest à éviter avec une sous-requête : la table dérivée construit l'ensemble des réponses pour les critères là ou (NOT) EXISTS ne vérifie qu'une seule fois l'existence
    A tester en fonction du SGBD-R, certains optimiseurs sont plus malins que d'autres
    Bien sur, NOT IN reste la solution pour une liste de valeurs "en dur"

  12. #12
    Invité
    Invité(e)
    Par défaut
    Dans le cas présent, comment écris-tu la requête avec NOT EXISTS ?

    (j'ai quelques requêtes NOT IN perso que je pourrais éventuellement optimiser...)

  13. #13
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 345
    Points : 39 743
    Points
    39 743
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par pauloSE Voir le message
    J'essaye d'effectuer une jointure pour afficher tous les membres qui ne sont pas déjà suivi par l'utilisateur, mais je n'y arrive pas...
    Citation Envoyé par jreaux62 Voir le message
    Dans le cas présent, comment écris-tu la requête avec NOT EXISTS ?
    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select MB.MB_id
         , MB.MB_nom
         , MB.MB_prenom
         , MB.MB_courriel
         . . .
    from membre as MB
    where not exists
         (select 1
          from contact as CT
          where CT.id_contact_suiveur = @utilisateur_connecte
            and CT.id_contact_suivi   = MB.MB_id)

Discussions similaires

  1. Réponses: 32
    Dernier message: 07/11/2007, 12h19
  2. Code source pour rechercher des fichiers Mp3 sur le disque
    Par specta61 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/02/2007, 19h49
  3. [XPath] Problème pour rechercher des caractères spéciaux
    Par JolyLoic dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 13/12/2006, 13h41
  4. Réponses: 1
    Dernier message: 30/08/2006, 18h08
  5. Outils pour rechercher des fuites de memoires dans un prog
    Par elekis dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 29/04/2005, 21h06

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