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 :

Récupérer un nombre d'amis en commun


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2012
    Messages : 20
    Points : 14
    Points
    14
    Par défaut Récupérer un nombre d'amis en commun
    Bonjour à toutes & tous,

    Je suis en train d’essayer de créer une fonctionnalité de « Suggestion d’amis » sur mon réseau social (comme peut le faire Viadeo , Linkedin ou Facebook par exemple).

    J’essaye de proposer des membres ayant des relations en commun, triés par nombre de connexions en commun.
    Par exemple, pour un utilisateur proposer :

    - Thomas : 6 amis communs => Ajouter comme ami
    - Clément : 4 amis communs => Ajouter comme ami
    - Thibaut : 3 amis communs => Ajouter comme ami

    Tout se joue avec la table wp_bp_friends qui est la suivante :
    initiator_user_id | INT | (celui qui envoie la demande d'ami)
    friend_user_id | INT | (celui qui à recu la demande d'ami)
    is_confirmed | INT | (=1 signifie que la personne à confirmé la demande d'ami)

    J’ai pu sortir la requête qui me donne les amis de mes amis, mais je n'arrive pas à savoir comment faire pour avoir ceux qui ont beaucoup de relations communes.

    Si quelqu'un a une piste à me donner, je suis preneur :-)

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 144
    Points
    144
    Par défaut
    Salut,

    Sauf erreur de ma part, une requête de ce type-là te remontera des couples de personnes non-amies (grâce au left join) qui ont des amis en commun.

    Il te reste à ne prendre par exemple que les 3 premières lignes ayant le plus de relations communes pour chaque personne ?

    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
     
     SELECT 
        r1.initiator_user_id as user_session, 
        r2.friend_user_id as potentiel_friend, 
        COUNT(DISTINCT r2.initiator_user_id) as common_relations
     FROM wp_bp_friends r1
     INNER JOIN wp_bp_friends r2 ON r2.initiator_user_id = r1.friend_user_id
     LEFT JOIN wp_bp_friends r3 
        ON (r3.initiator_user_id = r1.initiator_user_id OR r3.initiator_user_id = r1.friend_user_id)
        AND (r3.initiator_user_id = r2.initiator_user_id OR r3.initiator_user_id = r2.friend_user_id)
     WHERE r1.is_confirmed = 1
     AND r2.is_confirmed = 1
     AND r3.initiator_user_id IS NULL
     GROUP BY r1.initiator_user_id, r2.friend_user_id
     HAVING 0 < COUNT(DISTINCT r2.initiator_user_id)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2012
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Salut Yellu !

    Merci pour ton aide.
    Pour le moment, je ne peux pas voir si cela fonctionne, car trop de lignes dans ma DB et la requête est trop lourde.

    Il faudrait appliquer cette requête à un user_id particulier (pour avoir les amis des amis de ce user_id).

    Et comme la plupart des demandes d'amis ne sont pas acceptées, il faudrait pouvoir filtrer, en amont, sur is_confirmed = 1 .

    Je ne sais pas trop comment faire cela dans une requête aussi complexe, si tu as une idée

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2012
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    J'ai beau essayer de modifier la requête de Yellu, rien à faire...
    Pas sûr que ce soit possible mon affaire

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 144
    Points
    144
    Par défaut
    Salut,

    Pour limiter ma requête à un seul utilisateur il suffit de rajouter dans le WHERE un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND r1.initiator_user_id = < TON_PARAMETRE_USER_ID >

  6. #6
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Salut,

    Je suis parti du principe que tu avais une table "friends" contenant la liste de tes users (oui en fait elle s'appelerait plutôt user que friend).

    On commence par créer une vue donnant, pour chaque utilisateur, la liste de ses amis à partir de ta table wp_pb_friends :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    create view v_friend as 
    SELECT f.id, if(f.id=w.friend_user_id, w.initiator_user_id, w.friend_user_id) friend_id
    FROM friends f
      JOIN wp_bp_friends w on f.id = w.friend_user_id or f.id = w.initiator_user_id
    Note : j'ai ignoré le champ is_confirmed, je te laisse le rajouter.

    Ensuite la requête pour avoir le nombre d'amis communs entre le user d'id 1 et les autres est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select id1,id2, count(1) from (
    select f1.id id1, f2.id id2, v1.friend_id a1, v2.friend_id a2
      from friends f1 join v_friend v1 on v1.id = f1.id,
           friends f2 join v_friend v2 on v2.id = f2.id
         where f1.id = 1 and f2.id<>1
    ) b where a1=a2 
    group by id1,id2
    Désolé pour les règles de nommage toutes moches (a1,a2,b ...) j'ai fait rapidement.

    C'est probablement pas optimal mais sur mes tests ça semble répondre à ton besoin.

    Bon courage.

Discussions similaires

  1. Nombre d'amis communs
    Par cmoi70 dans le forum Langage SQL
    Réponses: 0
    Dernier message: 22/04/2009, 17h01
  2. [javascript/dom] Récupérer le nombre de lignes d'un tableau
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/02/2006, 11h51
  3. Récupérer le nombre de message dans sa boite GMAIL
    Par VERTYODA dans le forum Web & réseau
    Réponses: 4
    Dernier message: 28/11/2005, 19h25
  4. Réponses: 1
    Dernier message: 08/11/2005, 14h40
  5. récupérer un nombre aléatoire.
    Par loacast dans le forum C++
    Réponses: 3
    Dernier message: 18/10/2005, 12h37

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