2011-07-08 10 views
4

はので、私はChildOf = 0 ...シンプルな権利を持つすべてのレコードを選択するクエリを記述する必要がテーブルサブクエリ

Tasks 
-- 
TaskId (unique autoinc primary) 
ChildOf (Contains task ID of parent, or 0 if top tier (no parent)) 

がありますか?

[OK]をだけでなく、別の列は、各タスクが持っているどのように多くの子供告げる結果で返されている必要があり...

だから、結果は次のようになります...

TaskID ... ChildOf ... countChildren 
37 ...... 0 .... 3 
42 ...... 0 .... 0 
99 ...... 0 .... 1 

etc.... 

私が知っています私は必要な2つのクエリが...

Select TaskId as ParentTaskId, ChildOf from Tasks where ChildOf = 0 

次のようなものですが、何とかそれらを結合する必要があります
Select count(TaskId) from Tasks where ChildOf = ParentTaskId 

注:親子は... 2人の層しかありません...孫がいません!だからうまくいけばそれはそれほど複雑ではありません。

ご協力いただきまして誠にありがとうございます。これまでのすべての助けをありがとう!このような

+0

MySQLは今ANSIである再帰的な機能を欠いています。 MySQLのサイトでは、MySQLの階層データを扱う方法について素晴らしい記事がありましたが、Oracleはこれを取り除いているようです:/ –

+0

しかし、複数のレベルの子供を取得する必要がある場合は、再帰的な機能が必要です。それ以外の場合は単純なサブクエリです。だからブライアン、すぐにノードの数が必要ですか、ツリー全体(子供の子供たち)を数える必要がありますか? –

+0

優秀な質問...私はちょうど1つのレベルが必要です..親 - >子なし孫。 –

答えて

1

何かがそれを行う必要があります。

SELECT TaskId as ParentTaskId, ChildOf , 
(SELECT count(t2.TaskId) 
    FROM Tasks t2 
    WHERE t2.ChildOf = t.TaskId) as CountChildren 
FROM Tasks t 
WHERE t.ChildOf = 0 
+0

ありがとう!素晴らしい仕事を! –

0

これを試してみてください:

SELECT T1.TaskID, T1.ChildOf, count(*) from 
    Tasks as T1 join Tasks as T2 on T1.TaskID = T2.ChildOf 
    WHERE T1.ChildOf = 0 
    GROUP BY (T1.TaskID) 
+0

これは非常に近いですが、子供がいない両親を引き上げることはありません –

+0

JOINの代わりにLEFT JOINを使用して、子なしの両親を取得します。 –