2011-03-23 51 views
2

我想算屬於一組父頁面和獲得父母的行,比如總項目,MySQL的:計數的孩子,讓父行

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

試試這個:

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 
+0

感謝。但它會返回正確結果後的所有子頁面... – laukok 2011-03-23 03:10:19

+0

更新了SQL。請檢查。 – Chandu 2011-03-23 03:12:09

+0

再次感謝。現在一些有孩子的父母失蹤了...... – laukok 2011-03-23 03:21:37

0

我想你只是加入了錯誤的領域。試着加入x.parentid = root_pages.pg_id

2
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

謝謝。我嘗試了第一個建議,它返回了一些父母,但是父母認爲孩子失蹤了。同樣的第二個建議,並且父母名稱也不返回結果... – laukok 2011-03-23 03:23:39

+0

@lauthiamkok你能否確認'pg_id = parent_id'是什麼信號的父母記錄的假設?重新填寫第一個,如答案中所述,將LEFT改爲INNER加入。 – RichardTheKiwi 2011-03-23 03:32:42

+0

@Richard:是的,我可以確認'pg_id = parent_id'發信號通知父記錄。我似乎從@ Cyber​​nate的建議中得到了正確的結果。我要測試一下更多的細節。謝謝您的幫助。 – laukok 2011-03-23 03:36:56