【问题标题】:MySQL Count mutual friends between multiple usersMySQL计算多个用户之间的共同朋友
【发布时间】:2013-10-05 13:18:23
【问题描述】:

我需要统计A用户和其他用户(A, B, C, D, E...)之间的共同好友;

这是我当前relations 表的示例:

INSERT INTO `relations` (`id`, `related_to`, `user_id`) VALUES
(1, 10, 1),
(2, 12, 1),

(3, 10, 2),

(4, 12, 3),
(5, 10, 3),

(6, 10, 4),

(7, 3, 5),
(8, 2, 1),
(9, 1, 3);

现在我想计算用户1 和用户(2, 3, 4) 之间的共同朋友

所以我应该得到的结果是用户2 将有一个共同的朋友,用户3 将有两个共同的朋友,用户4 将有一个共同的朋友。

这里是SQL Fiddle 用于测试和选择语句显示一旦编写了正确的查询我应该得到哪些字段。

编辑我认为我应该纠正自己,我不需要获取相关用户的行,我实际上需要为每个用户 id 获取一个 COUNT 结果,例如@987654331 @

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    这行得通吗?

    SELECT r1.user_id AS first_user
    , r2.user_id as second_user
    , COUNT(r1.related_to) as mutual_friend_count
    FROM relations r1
    INNER JOIN relations r2
    ON r1.related_to = r2.related_to AND r1.user_id <> r2.user_id
    GROUP BY r1.user_id, r2.user_id
    

    我使用related_to 列将表格连接到自身,按用户对分组并计算他们之间的“related_to”数量

    【讨论】:

    • 是的,确实如此,再问一个问题,说 100k 行会很慢吗?
    • 如果两个字段都被索引,那会非常快。如果不是,我仍然会想象它会相对较快,因为它们都是整数字段。在您尝试之前,您可能不会知道。
    【解决方案2】:

    试试这个

    SELECT count(s.sum),s.user_id 
    from (select count(id) as sum,user_id from relations
    WHERE user_id != 1 and RELATED_TO in (select related_to from relations where user_id = 1)  group by RELATED_TO,user_id) as s group by user_id;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多