我如何使用mysql和PHP获取朋友的朋友

时间:2009-10-05 05:44:36

标签: php sql mysql

目前我需要使用PHP和MYSQL在我的应用程序中找到朋友的朋友

例如:数据库结构是这样的。表名:tbl_friendlist

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

我怎样才能实现这个目标

我可以通过

获得好友
SELECT * FROM tbl_friendlist WHERE mem_id = 1.

通过使用这个我能够得到我的朋友列表。现在我怎样才能得到朋友的朋友

6 个答案:

答案 0 :(得分:4)

所以,分步 - 你想找到你所有的朋友,然后你想找到他们所有的朋友。这些是查询(和子查询)的两个部分:

这就是你如何得到所有朋友的名单

SELECT friend_id
FROM tbl_friendlist
WHERE f.mem_id = 1

然后你就把它包装在第二部分:

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
)

您可能还想在其中添加一些额外的过滤器,例如:

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

这意味着你不会得到重复,而你会发现自己在朋友的朋友名单中。

答案 1 :(得分:4)

我也会做一个子查询(我的SQL真的很生锈,但查询看起来像这样)

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

答案 2 :(得分:3)

如果您需要找到没有子查询的方法,可以尝试通过连接表本身来实现此目的。

想法,未经测试:

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;

答案 3 :(得分:3)

nickf 的解决方案效果很好,但我个人会在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;

答案 4 :(得分:2)

嗯,我觉得这样的事情可能有用:

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

这会在f_of_f列中以逗号分隔值为您提供朋友的ids。

答案 5 :(得分:0)

和朋友的朋友们:

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;

这是正确的吗?