在MySQL上由共同朋友订购的朋友的建议

时间:2017-09-18 02:59:08

标签: mysql sql join left-join inner-join

我有下表

友谊

321

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是发送好友请求的用户。

我想根据共同的朋友数量获得朋友的建议,也就是说,共同的朋友越多,被推荐给我的机会就越大(用户登录)。

为此,我想到了以下内容:

  1. 选择我所有的朋友,然后
  2. 选择朋友的所有朋友(删除自己),然后选择
  3. 检查我的朋友的朋友是不是我的朋友,然后
  4. 向朋友推荐(由共同朋友点名)
  5. 但是,我无法付诸实践。为了实现第一步,我开始考虑(记录的用户friend_one为1):

    id

    所以我可以选择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
    

    所以,我收到了错误:

      

    错误代码:1054。“字段列表”中的未知列'myFriend'

    但是,我不知道如何继续。我认为的四个步骤是正确的?如果是这样,我如何“修复”错误并根据共同朋友的数量得到朋友的建议?

    期望的结果: 4(3个共同的朋友),3(1个共同的朋友)

1 个答案:

答案 0 :(得分:1)

您在第二步中将myFriend别名建立为SELECT子句的第一列;您不能将该别名用作同一SELECT子句中其他列的源。您必须在其位置重复CASE语句。或者,您可以在子查询中计算myFriend,并在某些位置按名称引用它。

这只是对您收到的错误消息的响应,而不是对完整算法的检查。