#该题目来源于力扣:
题目要求:
表 Submissions :
+---------------+----------+
| 列名 | 类型 |
+---------------+----------+
| sub_id | int |
| parent_id | int |
+---------------+----------+
上表可能会出现重复的行。
每行可以是一个帖子或对该帖子的评论。
如果这是一篇帖子,则 parent_id 为 null。
如果这是一条评论,则 parent_id 对应帖子的 sub_id。
编写一个解决方案以查找每个帖子的评论数。
结果表应包含帖子的 post_id 和对应的评论数 number_of_comments 。
Submissions 可能包含重复的评论。你应该统计出每个帖子的 唯一评论 的数目。
Submissions 可能包含重复的帖子。你应该将它们视为一个帖子。
返回结果表应该按 post_id 升序排序。
结果格式如下例所示。
示例 1:
输入:
Submissions table:
+---------+------------+
| sub_id | parent_id |
+---------+------------+
| 1 | Null |
| 2 | Null |
| 1 | Null |
| 12 | Null |
| 3 | 1 |
| 5 | 2 |
| 3 | 1 |
| 4 | 1 |
| 9 | 1 |
| 10 | 2 |
| 6 | 7 |
+---------+------------+
输出:
+---------+--------------------+
| post_id | number_of_comments |
+---------+--------------------+
| 1 | 3 |
| 2 | 2 |
| 12 | 0 |
+---------+--------------------+
解释:
表中 ID 为 1 的帖子有 ID 为 3、4 和 9 的三个评论。表中 ID 为 3 的评论重复出现了,所以我们只对它进行了一次计数。
表中 ID 为 2 的帖子有 ID 为 5 和 10 的两个评论。
表中 ID 为 12 的帖子没有评论。
表中 ID 为 6 的评论是对 ID 为 7 的已删除帖子的评论,因此我们将其忽略。
题目解释:
意思就是说,在针对全表进行去重之后,如果sub_id(帖子或评论的id列)对应的parent_id(评论的帖子id)为null,说明sub_id在列中是表示帖子的,如果sub_id对应的parent_id不为null,说明这里的sub_id是评论,而这里的parent_id就是评论的帖子id,对应的是parent_id为null的sub_id。现在要求统计每个帖子(非null的parent_id)被(对应parent_id为null的post_id)评论了多少次?
思路以及代码流程:
一步一步来:
首先,我们要求找到parent_id(被评论的帖子和评论列)为null的sub_id,就是sub_id(进行评论的帖子和评论)里是帖子的数据,然后把他和parent_id里不为null的值连接,这样就可以明确的区分parent_id列那个是评论,那个是帖子。也就是说,帖子无法评论,但可以被评论。评论可以评论,也可以被评论。
SELECT DISTINCT *
FROM
Submissions A
#左连接,保留所有parent_id为null的数据,就是作为帖子的sub_id值
LEFT JOIN
Submissions B
#将A表作为帖子sub_id值与B表的parent_id值连接,这样就筛选出了B表的parent_id值为帖子
ON A.sub_id = B.parent_id
WHERE A.parent_id IS NULL
数据为:
| sub_id | parent_id | sub_id | parent_id |
| ------ | --------- | ------ | --------- |
| 1 | null | 9 | 1 |
| 1 | null | 4 | 1 |
| 1 | null | 3 | 1 |
| 2 | null | 10 | 2 |
| 2 | null | 5 | 2 |
| 12 | null | null | null |
由此可见,被连接的B表的parent_id就自动去除了所有的非帖子值,实现了数据的初步清洗。这时 候我们就可以发现被评论的parent_id 为7的数据消失了,因为它不是帖子,而是被评论的评论。
然后我们就可以根据A.sub_id(帖子名称)和B.sub_id(评论的名称)进行分组聚合了
SELECT A.sub_id AS post_id, count(DISTINCT B.sub_id) AS number_of_comments
FROM
Submissions A
#左连接,保留所有parent_id为null的数据,就是作为帖子的sub_id值
LEFT JOIN
Submissions B
#将A表作为帖子sub_id值与B表的parent_id值连接,这样就筛选出了B表的parent_id值为帖子
ON A.sub_id = B.parent_id
WHERE A.parent_id IS NULL
GROUP BY A.sub_id
ORDER BY A.sub_id
标签:null,sub,parent,连接,帖子,评论,筛选,混合,id
From: https://blog.csdn.net/2302_77975940/article/details/143703668