2012-01-31 4 views
1

Возможно ли, используя только MySQL, написать запрос/функцию, чтобы получить следующие результаты?Попытка, рекурсивно, получить сумму таблицы

Пример таблицы:

 
+------------+ 
| ID | Child | 
+------------+ 
| 1 | 2  | 
| 1 | 3  | 
| 2 | NULL | 
| 3 | 4  | 
| 4 | 5  | 
| 4 | 6  | 
| 5 | NULL | 
| 6 | NULL | 
| 7 | NULL | 
+------------+ 

Пример Результаты:

 
+------------+ 
| ID | Child | 
+------------+ 
| 1 | 5  | 
| 2 | 0  | 
| 3 | 3  | 
| 4 | 2  | 
| 5 | 0  | 
| 6 | 0  | 
| 7 | 0  | 
+------------+ 

На простом английском языке: Счетные каждого ID и все их дети ... и их детей.

 
1's children are: 2, 3, 4, 5, 6 
3's children are: 4, 5, 6 
4's children are: 5, 6 

Я предполагаю, что это связано с какой-то умное использование подзапросов/функций/группирования, то SUM (COUNT (РЕБЕНОК)).

+1

Ref: http://stackoverflow.com/questions/2191847/sql-cte -counting-childs-recursion – Ara

+1

Использование «с» с MySQL связано с связанным ответом Ara: http://stackoverflow.com/questions/1382573/how-do-you-use-the-with-clause-in-mysql –

ответ

1

Вы не собираетесь любить это, но посмотрите на это article (да, это долго, извините: P)

+0

К сожалению они используют «трюк», используя столбцы lft и rgt. Я надеюсь решить это только двумя столбцами. –

+1

Хмм ... AFAIK, что просто невозможно. Вы можете решить его таким образом, если у вас есть фиксированное (и небольшое) количество детей, в котором вы можете создавать подзапросы для всех из них. Но когда дело доходит до многих уровней глубины, я не думаю, что вы сможете это решить, потому что MySQL не поддерживает рекурсивные запросы. Кроме того, не так много накладных, добавляя только 1 столбец :) –

+0

Ваш ответ настолько же точным, насколько и получается, насколько я могу судить. То есть, если невозможно создать рекурсивную функцию/процедуру в новом API MySQL ...? –