我有一个看起来像这样的表:
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是连接到该类别的帖子数。
应退回所有类别。
父类别应该具有类别+子类别总和的计数。(这是我遇到的问题之一)
子类别应具有类别总和。
我该怎么做?
答案 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
答案 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