2013-02-20 88 views
4

我有一個表,看起來像這樣:在參考家長和孩子計數行

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 

計數是連接類職位的數目。

應該返回所有類別。

父類別應具有類別+子類別總數的計數。(這是我遇到的問題之一)

子類別應該有類別總和。

我該怎麼做?

+0

你可以發佈您的代碼... – Hituptony 2013-02-20 16:08:13

回答

3

從您的預期結果看來,您似乎並不關心孫子和更低,在這種情況下,這應該起作用。爲了得到正確的父計數,我檢查了parent爲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 

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

+0

謝謝,但我不認爲這是正確的,因爲它不計算每個類別的帖子數量? – 2013-02-20 16:28:49

+0

@RasmusBengtsson - 對不起,你不明白你的問題。見上面的編輯:) – sgeddes 2013-02-20 16:34:32

+0

這正是我想要的,謝謝! – 2013-02-20 16:43:26

0

這是一般的提示。我不知道MySQL中的分析函數和分區是否可用,但是可以按類別對輸出進行分區,然後在類別中進行計數和總結。對分析功能和分段進行研究。我的意思的一般示例 - 輸出由deptno分區並進行排序。此外,最大HIREDATE分區中確定的 - 與數量,金額等代替最大...你的情況:

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