This question already has answers here:
Mutual friends sql with join (Mysql)
(4个答案)
两年前关闭。
我有下表
友谊:
在
我想得到基于共同朋友数的朋友建议,也就是说,共同的朋友越多,被推荐给我的机会就越大(用户登录)。
为此,我想到了以下几点:
选择我所有的朋友,然后
选择我朋友的所有朋友(删除我自己),然后
如果我朋友的朋友不是我的朋友,那么
向朋友建议(按共同朋友数量排序)
但是,我不能付诸实践。为了实现第一步,我从(考虑到登录用户的
所以我可以选择id为1的用户的所有朋友。
为了实现第二步,我做到了:
所以,我得到了错误:
错误代码:1054。“字段列表”中的未知列“myFriend”
但是,我不知道如何继续。我认为这四个步骤是正确的?如果是这样,我该如何“修正”错误,并根据共同的朋友数量获得朋友的建议?
预期结果:
4(3个共同的朋友),3(1个共同的朋友)
(4个答案)
两年前关闭。
我有下表
友谊:
id | friend_one | friend_two | status | date
1 | 1 | 2 | 2 | 10/06/2016
3 | 2 | 3 | 2 | 10/06/2016
4 | 2 | 4 | 2 | 10/06/2016
5 | 2 | 5 | 2 | 10/06/2016
6 | 4 | 5 | 2 | 10/06/2016
7 | 3 | 4 | 2 | 10/06/2016
8 | 3 | 7 | 2 | 10/06/2016
9 | 5 | 1 | 2 | 10/06/2016
10 | 6 | 4 | 2 | 10/06/2016
11 | 6 | 1 | 2 | 10/06/2016
在
friendship
表中,status = 2
表示他们是朋友,friend_one
是发送好友请求的用户。我想得到基于共同朋友数的朋友建议,也就是说,共同的朋友越多,被推荐给我的机会就越大(用户登录)。
为此,我想到了以下几点:
选择我所有的朋友,然后
选择我朋友的所有朋友(删除我自己),然后
如果我朋友的朋友不是我的朋友,那么
向朋友建议(按共同朋友数量排序)
但是,我不能付诸实践。为了实现第一步,我从(考虑到登录用户的
id
是1)开始:SELECT
CASE WHEN a.friend_one = 1 THEN a.friend_two ELSE a.friend_one END AS myFriend
FROM friendship a
WHERE 1 IN(a.friend_one, a.friend_two) AND a.status = 2
所以我可以选择id为1的用户的所有朋友。
为了实现第二步,我做到了:
SELECT
CASE WHEN a.friend_one = 1 THEN a.friend_two ELSE a.friend_one END AS myFriend,
CASE WHEN b.friend_one = myFriend THEN b.friend_two ELSE b.friend_one END AS friendFriend
FROM friendship a
LEFT JOIN friendship b ON myFriend IN (b.friend_one, b.friend_two) AND b.status = 2
WHERE 1 IN(a.friend_one, a.friend_two) AND a.status = 2
所以,我得到了错误:
错误代码:1054。“字段列表”中的未知列“myFriend”
但是,我不知道如何继续。我认为这四个步骤是正确的?如果是这样,我该如何“修正”错误,并根据共同的朋友数量获得朋友的建议?
预期结果:
4(3个共同的朋友),3(1个共同的朋友)
最佳答案
您在第二步中将myFriend
别名设置为SELECT子句的第一列;不能将该别名用作同一SELECT子句中其他列的源。你必须在原处重复这个陈述。或者,可以在子查询中计算myFriend
,并在某些地方按名称引用它。
这只是对您收到的错误消息的响应,而不是对完整算法的检查。
10-06 16:00