计算引用父项和子项中的行

时间:2013-02-20 15:57:40

标签: mysql sql

我有一个看起来像这样的表:

Categories:
cId | Name                    | Parent
----+-------------------------+-------
1   | Parent One              | NULL
2   | Child of 1st Parent     | 1
3   | Parent Two              | NULL
4   | Child of 1st Parent     | 1
5   | Child of 2nd Parent     | 2

该表不代表层次结构:每个项目都是孩子或父母,但不是两者。

这样一张桌子:

Posts:
pId | Name                    | cID
----+-------------------------+-------
1   | Post 1                  | 1
2   | Post 2                  | 2
3   | Post 3                  | 2
4   | Post 4                  | 3

我想对它运行一个返回此的查询:

cId | Count  
---+---------
1   | 3
2   | 2
3   | 1
4   | 0
5   | 0

Count是连接到该类别的帖子数。

应退回所有类别。

父类别应该具有类别+子类别总和的计数。(这是我遇到的问题之一)

子类别应具有类别总和。

我该怎么做?

2 个答案:

答案 0 :(得分:3)

根据您的预期结果,看起来您不关心孙子和更低,在这种情况下,这应该工作。为了获得正确的父计数,我正在检查Parent IS NULL或Count(children)> 0,在这种情况下,我加1:

SELECT c.cId, CASE WHEN C.Parent IS NULL OR COUNT(C2.cId) > 0 THEN 1 ELSE 0 END + 
    COUNT(C2.cId) TotalCount
FROM Categories C
    LEFT JOIN Categories C2 on c.cId = c2.Parent
GROUP BY c.cId

以下是一些示例小提琴:http://www.sqlfiddle.com/#!2/b899f/1

结果:

CID  TOTALCOUNT
1    3
2    2
3    1
4    0
5    0

<强> --- --- EDIT

通过阅读您的评论,您似乎想要这样的内容:

SELECT c.cId, 
    COUNT(DISTINCT P.pId) + COUNT(DISTINCT P2.pId) TotalCount
FROM Categories C
   LEFT JOIN Posts P ON C.CId = P.CId
    LEFT JOIN Categories C2 on c.cId = c2.Parent
   LEFT JOIN Posts P2 ON C2.CId = P2.CId
GROUP BY c.cId

http://www.sqlfiddle.com/#!2/eb0d2/3

答案 1 :(得分:0)

这是一般提示。我不知道MySQL中是否有分析函数和分区,但您可以按类别对输出进行分区,然后在类别中进行计数和总结。做一些关于分析函数和分区条款的研究。我的意思的一般例子 - 输出由deptno分区并有序。此外,max hiredate在分区内确定 - 将max替换为count,sum等......在您的情况下:

SELECT * FROM 
(  
SELECT deptno
     , empno
     , ename
     , sal
     , RANK() OVER (PARTITION BY deptno ORDER BY sal desc) rnk 
     , ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal desc) rno 
     , MAX(hiredate) OVER (PARTITION BY deptno ORDER BY deptno) max_hire_date
 FROM emp_test
ORDER BY deptno
)
--WHERE rnk = 1
ORDER BY deptno, sal desc
/

DEPTNO    EMPNO    ENAME    SAL    RNK    RNO    MAX_HIRE_DATE
--------------------------------------------------------------------
10        7839    KING      5000    1      1    1/23/1982
10        7782    CLARK     2450    2      2    1/23/1982
10        7934    MILLER    1300    3      3    1/23/1982
20        7788    SCOTT     3000    1      1    1/28/2013
20        7902    FORD      3000    1      2    1/28/2013
20        7566    JONES     2975    3      3    1/28/2013