【问题标题】:SQL Friends List QuerySQL好友列表查询
【发布时间】:2018-06-17 16:34:23
【问题描述】:

我是这个数据库 SQL 语言的新手,所以我会尽量让它简单。 (我正在使用 MySQL Workbench)

我有一个用户表,我希望多个用户彼此成为朋友。为此,我创建了有 user_id 和friend_user_id 的朋友表。假设我们有 (1,2), (2,3)。我希望将其读作:“2 是 1 和 3 的朋友,1 是 2 的朋友,3 是 2 的朋友”。所以当在这个朋友表上插入时,我从不做这样的事情(1,2),(2,1)。我正在寻找一个过程,通过接收 user_id 作为参数来返回他的所有朋友,无论他们是在 user_id 列还是在friend_user_id 列中。例如,如果我查找用户 2 的朋友,它应该出现在 1 列的 1 和 3,因为 1 和 3 是 2 的朋友。

更具体地说,当我调用 get_friends(2) 时,它应该会出现

[1]
[3]

即使这些在朋友表的不同列中。

【问题讨论】:

  • 尝试检查 SQL 连接

标签: mysql sql mysql-workbench


【解决方案1】:

您可以使用IN 来检查任一列是否等于您要查找的用户的 ID,并使用 CASE ... END 来获取不等于您要查找的用户的 ID 的列起来。

SELECT CASE
         WHEN user_id = 2
           THEN user_friend_id
         WHEN user_friend_id = 2
           THEN user_id
       END friend
       FROM friends
       WHERE 2 IN (user_id, user_friend_id);

或者,您可以使用UNION ALL 方法,因为它可以使用user_iduser_friend_id 上的索引,因此可能会表现更好。

SELECT user_id friend
       FROM friends
       WHERE user_friend_id = 2
UNION ALL
SELECT user_friend_id friend
       FROM friends
       WHERE friend_id = 2;

但这只有在有这样的索引时才会更好。如果没有,它可能需要对表进行两次扫描,而第一种方法只需要一次。所以在那种情况下会更糟。

【讨论】:

    【解决方案2】:

    使用UNION ALL获取所有好友,参数化这个查询:

    select friend_user_id as friend_id from friends f where f.user_id = 2 --parameter
    union all
    select user_id as friend_id from friends f where f.friend_user_id = 2 --parameter
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-07
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多