sql计数所有记录都属于父记录,可能有很多关系

时间:2015-05-14 06:22:27

标签: mysql sql

我有一个名为类别帖子的表格。帖子可以属于多个类别。一个类别有很多帖子,他们的关系是多对多。我创建了一个新的弱实体 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 :如果类别记录中有子项,那么该记录就不会有帖子。

2 个答案:

答案 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对结果进行分组,并计算每个类别的每个帖子。

这是example on sqlfiddle

答案 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