目前我需要使用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.
通过使用这个我能够得到我的朋友列表。现在我怎样才能得到朋友的朋友
答案 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;
这是正确的吗?