美文网首页
Leetcode614.二级关注者(中等)

Leetcode614.二级关注者(中等)

作者: kaka22 | 来源:发表于2020-07-13 00:06 被阅读0次

    在 facebook 中,表 follow 会有 2 个字段: followee, follower ,分别表示被关注者和关注者。

    请写一个 sql 查询语句,对每一个关注者,查询他的关注者数目。

    比方说:

    +-------------+------------+
    | followee    | follower   |
    +-------------+------------+
    |     A       |     B      |
    |     B       |     C      |
    |     B       |     D      |
    |     D       |     E      |
    +-------------+------------+
    

    应该输出:

    +-------------+------------+
    | follower    | num        |
    +-------------+------------+
    |     B       |  2         |
    |     D       |  1         |
    +-------------+------------+
    

    解释:

    B 和 D 都在在 follower 字段中出现,作为被关注者,B 被 C 和 D 关注,D 被 E 关注。A 不在 follower 字段内,所以A不在输出列表中。

    注意:
    被关注者永远不会被他 / 她自己关注。
    将结果按照字典序返回。

    产生数据

    CREATE TABLE follow(
    followee VARCHAR(10),
    follower VARCHAR(10));
    
    INSERT INTO follow VALUE('A', 'B'),('B', 'C'),('B', 'D'),('D', 'E');
    

    解答
    两表连接 主表的关注者 是附表的被关注者

    SELECT *
    FROM follow AS F
    JOIN follow AS F1
    ON F.`follower` = F1.`followee`
    

    对F.follower分组统计F1.follower的数量 这里需要去重

    SELECT F.`follower`, COUNT(DISTINCT F1.`follower`) AS num
    FROM follow AS F
    JOIN follow AS F1
    ON F.`follower` = F1.`followee`
    GROUP BY F.`follower`
    

    另一种思路就是选择 出现在关注者中的被关注者
    得到的就是关注者及他们的关注者

    SELECT *
    FROM follow AS F
    WHERE F.`followee` IN (SELECT F1.`follower`
    FROM follow AS F1)
    

    再根据flowee分组 统计flllower的数量即可

    SELECT F.`followee`, COUNT(DISTINCT F.`follower`) AS num
    FROM follow AS F
    WHERE F.`followee` IN (SELECT F1.`follower`
    FROM follow AS F1)
    GROUP BY F.`followee`
    

    相关文章

      网友评论

          本文标题:Leetcode614.二级关注者(中等)

          本文链接:https://www.haomeiwen.com/subject/uakocktx.html