2009-10-05 4 views
2

Actuellement, je suis dans le besoin de trouver les amis d'amis dans mon application en utilisant PHP et MYSQLComment vais-je obtenir mes amis d'amis à l'aide MySQL et PHP

Par exemple: la structure de base de données est comme ça. Nom de la table: tbl_friendlist

Ident mem_id friend_id 
1   2  1 
2   1  2 
3   1  3 
1   4  1 
5   1  8 

Comment puis-je obtenir ce

Je suis en mesure d'obtenir les amis par

SELECT * FROM tbl_friendlist WHERE mem_id = 1. 

En utilisant ce que je suis en mesure d'obtenir ma liste d'amis. Maintenant, comment puis-je obtenir le amis d'amis

+0

1. colonne est l'abréviation de: id est auto increment, mem_id est l'identifiant de l'utilisateur actuel et friend_id est l'identifiant des amis. 2. Il n'y a pas de limite pour le nombre maximum d'amis. – Fero

+0

c'est plus un problème de logique qu'un problème de technologie. D'abord, expliquez-nous ce que vos colonnes représentent.Les noms ne sont pas indicatifs de ce qu'ils sont utilisés. –

+0

ooops, a commenté trop tard ... –

Répondre

4

je ferais une sous-requête aussi bien (mon SQL est vraiment rouillé, mais la requête ressemblera à quelque chose comme ça)

SELECT * from tbl_friendlist where mem_id in (SELECT friend_id FROM tbl_friendlist WHERE mem_id = 1). 
+0

merci keith, votre code produit la sortie parfaite .. Et merci à tous ceux qui m'aide ... – Fero

+0

Cela fonctionne mais j'ai choisi d'upvote quelques-unes des autres réponses puisque dans les grandes tables, la sous-requête provoque un inconvénient de performance qui peut être évité en utilisant un JOIN sur lui-même. – Paulo

4

Alors, en faisant un pas dans les étapes - vous voulez trouver tous vos amis, et ensuite vous voulez trouver tous leurs amis. Ce sont les deux parties de votre requête (et sous-requête):

Voici comment vous obtiendrez une liste de tous vos amis

SELECT friend_id 
FROM tbl_friendlist 
WHERE f.mem_id = 1 

Et puis vous conclure que, dans la deuxième partie:

SELECT f.friend_id 
FROM tbl_friendlist f 
WHERE f.mem_id IN (
    SELECT f2.friend_id 
    FROM tbl_friendlist f2 
    WHERE f2.mem_id = 1 
) 

vous pouvez également ajouter quelques filtres supplémentaires là-bas, par exemple:

SELECT DISTINCT f.friend_id 
FROM tbl_friendlist f 
WHERE f.mem_id IN (
    SELECT f2.friend_id 
    FROM tbl_friendlist f2 
    WHERE f2.mem_id = 1 
) AND f.friend_id <> 1 

Cela signifie que vous n'obtiendra pas de doublons, et vous vous retrouverez dans la liste des amis de vos amis.

+0

Vous avez renommé les tables en sous-requêtes -> "WHERE f2.mem_id = 1" –

+0

Je pense que cela conduit à faux pseudo de sortie .. Parce que, selon la structure de tableau ci-dessus si j'ai le mem_id comme 2 alors, j'ai besoin de la sortie en tant que friend_id 2,3,4,8. Parce que friend_id 1 est mon ami. Et ses amis sont évidemment 2,3,4,8. J'ai donc besoin de 2,3,4,8. Mais si j'ai le mem_id comme 2 je viens d'obtenir le résultat freind_id 1. Alors, veuillez clarifier ma clarification .. Excusez si quelque chose que j'ai mentionné faux .. – Fero

+0

Merci Lukas. @Fero: cela pourrait avoir été à cause de la faute de frappe que lukas a souligné (changé maintenant). Cependant, du point de vue de votre table, la personne 1 n'est pas amie avec la personne 4, à moins que les amitiés soient symétriques. – nickf

3

Si vous avez besoin de trouver un moyen sans sous-requêtes, vous pouvez essayer de le faire par joindre la table sur lui-même.

Idée, non testé:

SELECT a.mem_id, b.mem_id AS secundaryfriends FROM tbl_friendlist AS a 
JOIN tbl_friendlist AS b ON a.friend_id = mem_id; 
+0

Vous devez utiliser simplement "JOIN", car vous n'avez pas besoin d'une valeur NULL si l'ami n'a pas d'amis, et aussi "b.mem_id AS secundaryfriends" devrait être "b.friend_id AS secundaryfriends". –

+0

ah, intérieur oui! mais l'autre commentaire semble faux. – markus

+0

Non, ce n'est pas faux: b.mem_id == a.friend_id, donc vous sélectionnez une liste de paires a.mem_id, a.friend_id. –

2

Hmm, je pense que quelque chose comme cela peut fonctionner:

SELECT 
    f1.friend_id, group_concat(f2.friend_id) as f_of_f 
FROM 
    tbl_friendlist f1 
    LEFT JOIN 
    tbl_friendlist f2 ON (f1.friend_id = f2.mem_id) 
WHERE 
    f1.mem_id = 1 
GROUP BY 
    f2.mem_id 

Cela vous donnera les IDs des amis d'amis comme une virgule valeur distincte f_of_f colonne.

3

La solution par nickf va bien, mais je voudrais personnellement faire cela dans un JOIN:

SELECT 
    DISTINCT fof.friend_id 
FROM 
    tbl_friendlist f 
    JOIN tbl_friendlist fof ON fof.mem_id=f.friend_id 
WHERE 
    f.mem_id = 1 AND fof.friend_id != 1; 
0

et les amis des amis des amis:

SELECT 
    DISTINCT fof.friend_id 
FROM 
    tbl_friendlist f 
    JOIN tbl_friendlist fof ON fof.mem_id=f.friend_id 
    JOIN tbl_friendlist fofof ON fofof.mem_id=fof.friend_id 
WHERE 
    f.mem_id = 1 AND fof.friend_id != 1; 

est c'est correct?