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 :

Comment récupérer tous les membres de mon site sauf ceux dont je suis amis ?


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Juillet 2015
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Comment récupérer tous les membres de mon site sauf ceux dont je suis amis ?
    Bonjour,

    Comment il faudrait faire pour récupérer les membres de mon site sauf ceux dont je suis amis avec sql ?

    En fait j'ai créé deux tables ci-dessous : une pour les membres et l'autre pour le lien d’amitié.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    .membres.
     
    CREATE TABLE `membres` (
      `membre_id` int(11) NOT NULL auto_increment,
      `membre_pseudo` varchar(32) NOT NULL default '',
      `membre_mdp` varchar(40) NOT NULL default '',
      `membre_mail` varchar(100) NOT NULL default '',
      `membre_sexe` varchar(100) NOT NULL default '',
      `membre_inscription` bigint(20) NOT NULL default '0',
      `membre_naissance` varchar(11) NOT NULL default '',
      `membre_pays` varchar(255) NOT NULL default '',
      `membre_ville` varchar(255) NOT NULL default '',
      `membre_telephone` varchar(255) NOT NULL default '',
      `membre_avatar` varchar(255) NOT NULL default '',
      `interet` varchar(255) NOT NULL default '',
      `sexe_interet` varchar(255) NOT NULL default '',
      `pays_interet` varchar(255) NOT NULL default '',
      `ville_interet` varchar(255) NOT NULL default '',
      `membre_derniere_visite` bigint(20) NOT NULL default '0',
      `membre_banni` int(11) NOT NULL default '0',
      PRIMARY KEY  (`membre_id`),
      UNIQUE KEY `membre_pseudo` (`membre_pseudo`),
      UNIQUE KEY `membre_mail` (`membre_mail`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=30 ;
     
     
    .liste_amis.
     
    CREATE TABLE `liste_amis` (
      `id` int(11) NOT NULL auto_increment,
      `user1` bigint(20) NOT NULL default '0',
      `user2` bigint(20) NOT NULL default '0',
      `statut` varchar(255) NOT NULL default '',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
    - j'ai écrit cette requête pour récupérer les amis d'un membre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT  membres.membre_id, membres.membre_pseudo,  membres.membre_avatar, liste_amis.id  FROM  membres, liste_amis
      where ((membres.membre_id = liste_amis.user1 and  liste_amis.user2= "'.$_SESSION['membre_id'].'" and statut="Amis")  
      or (membres.membre_id = liste_amis.user2 and  liste_amis.user1 = "'.$_SESSION['membre_id'].'" and statut="Amis"))
    .

    jusque la c'est bon.

    le problème est que si j'entre dans la page de suggestion d'amis, ça m’affiche tous les membres de mon site. et moi je voulais que ça affiche tous les membres sauf mes amis. j'ai essayé avec la requête suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT  membres.membre_id,  membre_pseudo,  membres.membre_avatar, liste_amis.id  FROM  membres, liste_amis
      where ((membres.membre_id != liste_amis.user1 and  liste_amis.user2= "'.$_SESSION['membre_id'].'" and statut="Amis")  
      or (membres.membre_id != liste_amis.user2 and  liste_amis.user1 = "'.$_SESSION['membre_id'].'" and statut="Amis"))
    ça ne fonctionne pas toujours.

    C'est très dur d'expliquer.

    Merci d'avance,
    salutations

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Je n'y connais rien en réseaux sociaux, mais pour être ami, ne faut il pas être membre ?
    Si c'est le cas, alors on devrait trouver les fk des 2 membres dans la table amis

    Pour ce qui est de la requete, il faut fuir comme la peste les prédicats "différent" non indexables (non "sargables")

    Ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where ((membres.membre_id != liste_amis.user1...
    va produire, si les tables sont volumineuses, un temps de traitement considérable, car un where <> ne peut être vérifié que par un tablespace scan

    Pour vérifier qu'un membre n'est pas déjà ami, plusieurs possibilités
    - where not exists(requete de sélection des amis) : souvent le mieux en terme de performance
    - where idmembre not in (requete de selection des amis) : bien aussi si la liste des amis est courte, mais moins bien que la requete exists
    - utilisation d'une jointure outer et test de nullité d'une colonne not null

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Les tables sont très mal construites :

    - de nombreuses colonnes sont définies inutilement en varchar 255 ou 100 : c'est, couteux et pénible pour les requetes. Pour les pays, la norme ISO3166 propose deux listes de codes sur 2 et sur 3 caractères. Pour le sexe, un caractère suffit. Et un téléphone sur 255, c'est pour enregistrer le n° ou toute la conversation ?

    - il semble que la PK membre_id de la table membres, corresponde aux colonnes user1 et user2 de la table liste_amis puisque vous faites les jointures sur ces colonnes. Or, les FK DOIVENT être de même format que celui de la colonne dont elles ont hérité, à la fois pour des raisons d'intégrité et de performances (requête non sargable si formats <>).

    - membre_derniere_visite, est très probablement une date, il faut donc utiliser un format date (ou dateheure ou timestamp), les dates contenues dans des colonnes d'autres formats sont une source d'ennuis. membre_naissance est peut être dans ce cas aussi...

    - membre.sexe_interet, membre.interet, membre.pays_interet et membre.ville_interet c'est quoi ?
    Si ce sont des centres d'intêret du membre, la modélisation n'est pas bonne, il faut externaliser dans une table en cardinalité 0,n les centres d'intêret d'un membre, table qui pointera vers une autre table des typologies d'intérêt

    - pourquoi certains noms de colonnes de la table membre sont préfixées par "membre_" et d'autres non, ca n'est pas très cohérent

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Juillet 2015
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    bonjour,

    merci de m'avoir répondu, mon problème était compréhensif.
    il fallait juste que j'ajoute le mot "not in" .
    j'ai essayer avec cette requête et ça a fonctionner:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    SELECT membre_id, 
    membre_pseudo, 
    membre_avatar 
    FROM membres 
    where membre_id != "'.$_SESSION['membre_id'].'" 
    and membre_id not in     (select user2 
     
         from liste_amis 
     
         where user1= "'.$_SESSION['membre_id'].'" and statut="Amis") 
     
         or
     
             (select user1 
     
             from liste_amis 
     
             where user2="'.$_SESSION['membre_id'].'" 
     
             and statut="Amis") 
     
             or 
     
                  (select user2 
     
                  from liste_amis 
     
                  where user1= "'.$_SESSION['membre_id'].'" 
     
                  and statut="en_etente") 
     
                  or
     
                       (select user1 
     
                       from liste_amis 
     
                       where user2="'.$_SESSION['membre_id'].'" 
     
                        and statut="en_etente")

    merci d'avance...

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    La requete c'est une chose, la modélisation en est une autre bien plus importante.

    Je me permets d'insister, relisez mes posts précédents, un modèle comme celui là vous emmène tout droit vers les gros, gros ennuis :
    requetes alambiquées et incompréhensibles donc difficiles à maintenir, temps de réponse rédhibitoires et surtout, intégrité des données absolument non garantie

    L'intégrité des données étant le socle de toute base qui se respecte, à vous de voir

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

Discussions similaires

  1. Comment récupérer tous les valeurs(dynamique) d'un formulaire post.
    Par olikhvar dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 22/03/2012, 16h32
  2. [MySQL] comment controler tous les champs de mon formulaire ?
    Par baxterbax dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/01/2012, 09h04
  3. Réponses: 4
    Dernier message: 22/04/2008, 12h19
  4. Comment lister tous les utilisateurs de mon LDAP
    Par PrinceMaster77 dans le forum ASP
    Réponses: 6
    Dernier message: 30/10/2007, 20h29
  5. Réponses: 3
    Dernier message: 03/10/2006, 13h02

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