我有一个MySQL表articles
,在其中按以下层次结构组织了内容:
上面的每个项目都位于具有以下字段的行中:id
,parent
,name
等。
帖子行parent
等于章节行id
,章节行parent
等于主题行id
,主题行parent
等于章节行{{1} }。
我没有比上面更高的等级。
我需要选择给定部分中的主题列表以及每个主题的所有子项的计数。计数是后代章节及其后代(即帖子)的数量之和。
我的兄弟帮助我进行了以下选择查询。但是,它的速度相对较慢,大约为0.6秒。
id
我需要改善性能的帮助。
非常感谢!
答案 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
可能会阻碍优化器。