MySQL: считать детей и получать родительские строки - PullRequest
1 голос
/ 23 марта 2011

Я хочу подсчитать общее количество элементов, которые принадлежат группе родительских страниц, и получить строки родительских элементов, например,

pg_id     pg_title      parent_id
1         A             1            
2         B             2
3         C             3
4         d             1
5         e             1
6         f             2
7         g             1
8         k             3
9         l             3
10        j             3

Поэтому я хочу получить такой результат,

ParentName    ParentID      TotalCout
A             1             3
B             2             1
C             3             3

Вот запрос, который я получил до сих пор, но он не возвращает правильный результат, он не получает заголовок страницы родителей, а вместо этого возвращает заголовок страницы их детей

SELECT root_pages.pg_title as ParentName,x.ParentID,x.TotalCount
FROM 
(
SELECT root_pages.parent_id as ParentID, COUNT(root_pages.parent_id) as TotalCount
FROM root_pages
WHERE root_pages.parent_id != root_pages.pg_id
AND root_pages.pg_hide != '1'
GROUP BY root_pages.parent_id
)x

LEFT JOIN root_pages
ON x.ParentID = root_pages.parent_id

GROUP BY x.ParentID

Есть идеи, как мне получить правильный результат, который мне нужен?

Спасибо

Ответы [ 3 ]

2 голосов
/ 23 марта 2011

Попробуйте это:

SELECT a.pg_title as ParentName,
             a.pg_id as ParentID,
             b.TotalCout
  FROM root_pages a INNER JOIN
         (
        SELECT parent_id, COUNT(1) as TotalCout
          FROM root_pages
           WHERE parent_id <> pg_id
        GROUP BY parent_id
         ) b 
     ON a.pg_id = b.parent_id
     AND b.TotalCout>0
2 голосов
/ 23 марта 2011
select p.pg_title ParentName, p.pg_id ParentID, IFNULL(c.TotalCout,0) TotalCout
from root_pages p
left join
(
    select parent_id, count(*) TotalCout
    from root_pages
    where parent_id != pg_id
    group by parent_id
) c on c.parent_id=p.pg_id
WHERE p.pg_id = p.parent_id

Измените LEFT JOIN на INNER JOIN, если вас не интересуют корневые (родительские) страницы без дочерних элементов.

В одном выборе, учитывая свойство данных, которое root := (parent_id=pg_id)

select max(case when pg_id=parent_id then pg_title end) ParentName,
       parent_id ParentID,
       count(*)-1 TotalCout
from root_pages
group by parent_id
having count(*) > 1
0 голосов
/ 23 марта 2011

я думаю, что вы просто присоединяетесь не на том поле.попробуйте присоединиться x.parentid = root_pages.pg_id

...