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

この表は階層を表すものではありません。すべてのアイテムは子または親のいずれかですが、両方ではありません。

そしてこのような1つのテーブル:

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

カウントは、カテゴリに接続されている投稿の数です。

すべてのカテゴリを返す必要があります。

親カテゴリには、カテゴリの数+子カテゴリの合計が必要です。(これは私が問題を抱えていることの1つです)

子カテゴリには、カテゴリの合計が必要です。

これはどのようにすればよいですか?

4

2 に答える 2

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

- -編集 - -

コメントを読むと、次のようなものが必要なようです。

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

于 2013-02-20T16:10:29.970 に答える
0

これは一般的なヒントです。MySQL で分析関数とパーティショニングが利用できるかどうかはわかりませんが、出力をカテゴリ別にパーティショニングし、カテゴリ内でカウントして合計することができます。分析関数と句による分割について調査します。私が意味したことの一般的な例 - 出力は deptno によって分割され、順序付けられます。また、パーティション内で決定された最大雇用日-最大をカウント、合計などに置き換えます...あなたの場合:

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
于 2013-02-20T16:21:28.477 に答える