【问题标题】:sql - filtering results of a select statement - build a user suggestion querysql - 过滤选择语句的结果 - 构建用户建议查询
【发布时间】:2017-12-03 17:14:52
【问题描述】:

我有一个基于社交网络的 sql 结构,包括一个表“follows”,其中一列包含关注者的用户 ID 和被关注者的用户 ID。很简单。

现在我想构建一个用户建议工具。我需要一个查询来获取我关注的人正在关注的用户。当然,它还需要对我已经关注的人进行排序,它应该计算我关注特定人的关注人数,以便我可以对建议进行排序。

SELECT
  users.userid,
  users.username,
  COUNT(me.from_userid)

FROM follows AS he

INNER JOIN users
   ON users.userid = he.to_userid

LEFT  JOIN follows AS me
   ON me.from_userid = 33
  AND me.to_userid = he.from_userid

WHERE me.to_userid != he.to_userid
GROUP BY users.userid

我已经建立了一个查询,但不知何故,它只是给了我所有用户和一般用户关注者的数量。

我试图在一个例子中解释想要的查询,所以它更容易理解。 (userid = 1 是我)

如果有人可以帮助我,那就太好了!

【问题讨论】:

    标签: mysql sql social-networking


    【解决方案1】:

    请看下面的解决方案

    数据

    CREATE TABLE follows
    (from_user_id INT,
     to_user_id   INT);
    
    INSERT INTO follows VALUES (1, 2);
    INSERT INTO follows VALUES (1, 4);
    INSERT INTO follows VALUES (2, 3);
    INSERT INTO follows VALUES (2, 4);
    
    CREATE TABLE users
    (user_id INT, 
     user_name VARCHAR(100));
    
    INSERT INTO users VALUES (1, 'TEST1');
    INSERT INTO users VALUES (2, 'TEST2');
    INSERT INTO users VALUES (3, 'TEST3');
    INSERT INTO users VALUES (4, 'TEST4');
    

    解决方案

    SELECT u.user_id, u.user_name, COUNT(*)
      FROM follows his JOIN 
           (SELECT DISTINCT he.to_user_id
                FROM follows me JOIN follows he 
                                  ON (me.to_user_id = he.from_user_id)
              WHERE me.from_user_id = 1
                AND he.to_user_id NOT IN 
                           (SELECT me.to_user_id
                              FROM follows me 
                             WHERE me.from_user_id = 1)) my
            ON his.to_user_id = my.to_user_id 
            JOIN users u
            ON (his.to_user_id = u.user_id)
     GROUP BY u.user_id, u.user_name;    
    

    输出

    user_id user_name   COUNT(*)
    3       TEST3       1
    

    解释

    • 子查询 (my) - 查找所有关注我的追随者的人。同时排除那些已经是我的追随者的人。
    • 主查询 - 查找关注从子查询返回的人员的人员列表,并进行分组以获取关注他/她的人数。

    希望这会有所帮助。如果您需要进一步解释,请告诉我。

    【讨论】:

    • 用户的选择效果很好。但是“计数”列仍然只显示用户的所有关注者。我需要它来显示我也关注的追随者的数量。所以我可以根据相关性对其进行排序
    • 这就是我认为查询正在做的事情。你能给我一个示例数据集和预期的输出吗?
    • 想象一下有更多用户关注 User3。所以可能有10个追随者。无论如何,计数器应该保持在 1,因为只有 我的朋友中的 1 个(=我关注的人)关注 User3。你明白吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    相关资源
    最近更新 更多