2016-12-29 8 views
1

私は1つのことで助けが必要です。SQL *を選択し、同じテーブルの別のクエリ結果の数を返します

表は

select *, COUNT((SELECT ID FROM ... WHERE parent = this.ID)) from ... 

は、SQL内でいる可能性があり、私は1つの選択クエリ内で、テーブルから取得し、私は子供のアイテムが行ごとにカウントを取得したい

ID, name, parent 
1, ABC, - 
2, DEF, 1 
3, GHI, 1 

のようなものですか?あなたが孫を含めたい場合、これは動作しません。

結果は、あなたが唯一の子レベルを持っている場合、この

select *, (SELECT count(B.ID) FROM Yourtable B WHERE A.Id = B.Parent) 
from Yourtable A 

注意をしてみてください

1, ABC, 2 
2, DEF, 0 
3, GHI, 0 
+0

あなたは、階層的な結果が必要です、または親子関係の1つのレベルは十分だろうか? – Mureinik

答えて

0

それ自体でテーブルに参加してください。

SELECT t1.*, IFNULL(COUNT(t2.id), 0) AS childcount 
FROM yourTable AS t1 
LEFT JOIN yourTable AS t2 ON t2.parent = t1.id 
GROUP BY t1.id 

LEFT JOIN子が存在しない場合に対処する必要があるので、あなたは(INNER JOINは、それらの行を省略します)結果に0を取得します。

+0

おっと、GROUP BYを忘れました。一定。 – Barmar

+0

これはちょうど最初の行を選択しました - 子供がいなくてもすべての行が必要です – user1980807

+0

@ user1980807 'GROUP BY'を追加する前か後に私の答えを使いましたか? – Barmar

0

ようにする必要がありますカウント

+0

これは恐ろしいです - O(n^2)各行のサブクエリです。 – Hogan

1

は、それぞれの親のためのカウントを取り、IDに元のテーブルとそれに参加左:

SELECT 
    t1.id, t1.name, IFNULL(c, 0) cnt 
FROM 
    your_table t1 
     LEFT JOIN 
    (SELECT 
     parent, COUNT(*) c 
    FROM 
     your_table 
    GROUP BY parent) t2 ON t1.id = t2.parent; 
関連する問題