Leetcode614.二级关注者(中等)

在 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.二级关注者(中等))