2016-12-29 5 views
1

Мне нужна помощь с одной вещью;SQL Select * и подсчет другого результата запроса из той же таблицы

Таблица подобна

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

Я хочу, чтобы рассчитывать дети-элементы для каждой строки, я получаю из таблицы, в запросе один выбор

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

Возможно ли это в SQL?

Результат должен быть, как

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

вам нужно иерархические результаты делать, или бы один уровень детско-родительских отношений будет достаточно? – 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 необходимо обработать случай, где нет детей, так что вы получите 0 в результате (INNER JOIN бы опустить эти строки).

+0

К сожалению, забыли команду GROUP BY. Исправлена. – Barmar

+0

Это выбрано только первая строка - мне нужны все строки, даже без дочерних – user1980807

+0

@ user1980807 Использовал ли я свой ответ до или после добавления «GROUP BY» к нему? – Barmar

0

Если у вас есть только один уровень ребенка, то попробуйте этот

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

Примечание: Это не будет работать, если вы хотите включить главный ребенка count

+0

Это ужасно - O (n^2) дополнительный запрос для каждой строки. – Hogan

1

Берут отсчеты для каждого родителя и слева объединить его с исходной таблицей по идентификатору:

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;