选择MySQL中所有子行的计数

时间:2019-07-06 03:30:23

标签: mysql sql database

我有一个MySQL表articles,在其中按以下层次结构组织了内容:

  1. 部分
  2. 主题
  3. 发布

上面的每个项目都位于具有以下字段的行中:idparentname等。

帖子行parent等于章节行id,章节行parent等于主题行id,主题行parent等于章节行{{1} }。

我没有比上面更高的等级。

我需要选择给定部分中的主题列表以及每个主题的所有子项的计数。计数是后代章节及其后代(即帖子)的数量之和。

我的兄弟帮助我进行了以下选择查询。但是,它的速度相对较慢,大约为0.6秒。

id

我需要改善性能的帮助。

非常感谢!

1 个答案:

答案 0 :(得分:2)

这种逻辑很难遵循,但我认为您打算这样做:

SELECT s.id, s.name, s.link,
       ( (SELECT COUNT(*)  -- count children
          FROM articles c
          WHERE c.parent = s.id
         ) +
         (SELECT COUNT(*)  -- count grandchildren
          FROM articles c JOIN
               articles p
               ON p.parent = c.id
          WHERE c.parent = s.id
         )
    ) as child_count
FROM articles s
WHERE s.parent = 62;

然后对于此查询,您需要在articles(parent)上建立索引。

注意:

  • 从不FROM子句中使用逗号。
  • 始终使用正确的,明确的,标准 JOIN语法。您的兄弟也需要学习如何编写正确的SQL。
  • COUNT(DISTINCT)可能比COUNT()更昂贵。
  • 相关或OR子句中的
  • ON可能会阻碍优化器。