我有一个名为类别和帖子的表格。帖子可以属于多个类别。一个类别有很多帖子,他们的关系是多对多。我创建了一个新的弱实体 cat_post 表。在类别中,记录可以包含许多孩子而不是孩子的孩子。所以我想计算所有帖子属于所有父记录。
类别表字段
id category_id
1
2
3
4 1
5 1
6 2
7 2
帖子表
id
1
2
3
cat_post表字段
tender_id category_id
1 4
2 5
3 3
3 5
4 6
4 4
类别:
+-----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
+-----------------+--------------+------+-----+---------+----------------+
| category_id | int(11) | NO | NULL | NULL | NULL |
+-----------------+--------------+------+-----+---------+----------------+
帖子:
+-------------------+--------------+------+-----+---------+-----------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+-----------+
| id | int(11) | NO | PRI | NULL | |
+-------------------+--------------+------+-----+---------+-----------+
cat_post:
+---------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------+------+-----+---------+-------+
| category_id | int(11) | NO | PRI | NULL | |
| post_id | int(11) | NO | PRI | NULL | |
+---------------+---------+------+-----+---------+-------+
我想计算属于父记录的所有帖子。换句话说,将category.category_id仅为null的类别的每个父记录的所有帖子计数 NB :如果类别记录中有子项,那么该记录就不会有帖子。
答案 0 :(得分:0)
据我了解,这符合您的要求:
(在我的示例中, tender_id 被命名为 post_id )
SELECT c.id, count(p.id) as postcount
FROM Category AS c
INNER JOIN cat_post AS cp ON c.id = cp.category_id
INNER JOIN Posts AS p ON p.id = cp.post_id
WHERE c.category_id is null
GROUP BY c.id
这将连接所有表,只选择那些 parent 的记录(类别中没有category_id)。然后它按category.id对结果进行分组,并计算每个类别的每个帖子。
答案 1 :(得分:0)
你应该自己连接CATEGORY表,即使有0个孩子,也要计算Categories
。然后在我使用cat_post
的Join中连接OR
表来处理主类别没有子节点的情况。此外,如果您只想计算每个类别的DISTINCT帖子,请使用COUNT(DISTINCT)(例如,如果一个帖子属于一个父类别的两个不同子级,那么您应该将其视为一个或两个吗?)
SELECT A.Id, COUNT(DISTINCT cat_post.Post_Id) FROM Category A
LEFT JOIN Category B on A.Id=B.Category_id
LEFT JOIN cat_post ON (cat_post.category_id = B.Id)
or
(cat_post.category_id = A.Id)
WHERE A.Category_Id is NULL
GROUP BY A.id