在 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`
网友评论