This question already has answers here:
Mutual friends sql with join (Mysql)
(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