我有张桌子看起来像这样:
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计数是与该类别相关联的职位数。
所有类别都应返回。
父类别应该有类别+子类别之和的计数。(这是我有问题的事情之一)
子类别应该有类别和。
我该怎么做?
发布于 2013-02-20 16:10:29
从你的预期结果来看,你似乎不关心孙子和更低的孩子,在这种情况下,这应该是可行的。为了获得正确的父计数,我正在检查是否为NULL或count (子)> 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--编辑--
从阅读你的评论来看,你似乎想要这样的东西:
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发布于 2013-02-20 16:21:28
这是一般的暗示。我不知道MySQL中是否有分析函数和分区,但是您可以将输出按类别划分,然后在类别中进行计数和汇总。对解析函数和分句进行了一些研究。一般的例子,我的意思-输出是分区的部门和排序。此外,在分区内确定的最大值-用计数、和等替换最大值。就你而言:
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/2013https://stackoverflow.com/questions/14984294
复制相似问题