首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在引用父母和子女时计算行数

在引用父母和子女时计算行数
EN

Stack Overflow用户
提问于 2013-02-20 15:57:40
回答 2查看 1.4K关注 0票数 4

我有张桌子看起来像这样:

代码语言:javascript
复制
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

该表并不表示传家宝:每个项目要么是子项目,要么是父项,但不是两者兼而有之。

还有一张这样的桌子:

代码语言:javascript
复制
Posts:
pId | Name                    | cID
----+-------------------------+-------
1   | Post 1                  | 1
2   | Post 2                  | 2
3   | Post 3                  | 2
4   | Post 4                  | 3

我想对它运行一个查询,返回如下内容:

代码语言:javascript
复制
cId | Count  
---+---------
1   | 3
2   | 2
3   | 1
4   | 0
5   | 0

计数是与该类别相关联的职位数。

所有类别都应返回。

父类别应该有类别+子类别之和的计数。(这是我有问题的事情之一)

子类别应该有类别和。

我该怎么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-20 16:10:29

从你的预期结果来看,你似乎不关心孙子和更低的孩子,在这种情况下,这应该是可行的。为了获得正确的父计数,我正在检查是否为NULL或count (子)> 0,在这种情况下,我将添加1:

代码语言:javascript
复制
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

其结果是:

代码语言:javascript
复制
CID  TOTALCOUNT
1    3
2    2
3    1
4    0
5    0

--编辑--

从阅读你的评论来看,你似乎想要这样的东西:

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2013-02-20 16:21:28

这是一般的暗示。我不知道MySQL中是否有分析函数和分区,但是您可以将输出按类别划分,然后在类别中进行计数和汇总。对解析函数和分句进行了一些研究。一般的例子,我的意思-输出是分区的部门和排序。此外,在分区内确定的最大值-用计数、和等替换最大值。就你而言:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14984294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档