2012-04-17 2 views
2

У меня есть следующие структуры таблицы:Рекурсивный выбор?

enter image description here

Таким образом, каждый пост на форуме есть родитель, который также имеет родитель (за исключением корневых штифтов) и т.д. Что мне нужно, чтобы получить общее количество детей, в том числе детей его детей, детей внуков и т. д.

На данный момент у меня есть простой выбор, который возвращает немедленные детей:

select count(*) as child_count 
from forumposts 
where parent_forum_post_id = $criteria.fid 

Я даже не уверен, что это выполнимо с помощью SQL, но я новичок в SQL, так что я подумал, что кто-то может дать некоторые идеи.

Любая помощь приветствуется. Благодарю.

+0

Эта нить может помочь: http://stackoverflow.com/questions/1323245/sql-recursion-without-recursion –

+0

В следующий раз, пожалуйста, напишите выборочные данные, как 'заявления INSERT'. Или, по крайней мере, как текст. Таким образом, для тех, кто отвечает на установку тестового стола с данными, проще. –

+0

Хорошо, я попробую это :) – Fofole

ответ

6

Это следует сделать это:

with recursive all_posts (id, parentid, root_id) as 
(
    select t1.id, 
     t1.parent_forum_post_id as parentid, 
     t1.id as root_id 
    from forumposts t1 
    where t1.parent_forum_post_id is null 

    union all 

    select c1.id, 
     c1.parent_forum_post_id as parentid, 
     p.root_id 
    from forumposts c1 
    join all_posts p on p.id = c1.parent_forum_post_id 
) 
select root_id, count(*) 
from all_posts 
order by root_id; 

Вы можете изменить "стартового", изменяя состояние where t1.parent_forum_post_id is null.

0
WITH RecursiveCte AS 
(
SELECT 1 AS LEVEL, 
     H1.intUserId, 
     H1.intReportsTo, 
     H1.strUserName 
FROM mstUsers H1 
WHERE id = @intUserId 
UNION ALL 
SELECT RCTE.level + 1 AS LEVEL, 
     H2.intUserId, 
     H2.intReportsTo, 
     H2.strUserName 
FROM mstUsers H2 
     INNER JOIN RecursiveCte RCTE 
      ON H2.intReportsTo = RCTE. 
) 
SELECT intUserId,strUserName,LEVEL FROM RecursiveCte 
Смежные вопросы