【问题标题】:MySQL: Count children and get parent rowsMySQL:计算子项并获取父行
【发布时间】:2011-03-23 11:41:45
【问题描述】:

我想统计属于一组父页面的项目总数并获取父页面的行,例如,

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

有什么想法可以得到我需要的正确结果吗?

谢谢

【问题讨论】:

    标签: php mysql count group-by


    【解决方案1】:

    试试这个:

    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】:
    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
    

    【讨论】:

    • 谢谢。我尝试了第一个建议,它返回了一些父母,但父母认为孩子失踪了。第二个建议相同,并且结果中也不返回父名称...
    • @lauthiamkok 您能否确认pg_id = parent_id 是父记录信号的假设?重新第一个,将 LEFT 更改为 INNER join,如答案中所述。
    • @Richard:是的,我可以确认pg_id = parent_id 发出父记录的信号。我似乎从@Cyber​​nate 的建议中得到了正确的结果。我将对其进行更详细的测试。感谢您的帮助。
    • @lauthiamkok 将 HAVING 添加到应该更快的第二个查询中,它排除了父记录没有子记录的位置。
    • 谢谢理查德。只是试了一下,奇怪的是一些父母仍然失踪,它为一些父母姓名返回 NULL
    【解决方案3】:

    我认为你只是加入了错误的领域。尝试加入x.parentid = root_pages.pg_id

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-19
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多