我有一个 MySQL 表 articles
,我在其中组织了以下层次结构中的内容:
- 部分
- 主题
- 章节
- 发布
上面的每一项都在一行中,包含以下字段:id
、parent
、name
等
帖子行parent
等于章节行id
,章节行parent
等于主题行id
和主题行parent
等于节行 id
。
我没有比上面更高的层级。
我需要选择给定部分中的科目列表以及每个科目的所有 child 的数量。该计数是后代章节数及其作为帖子的后代数的总和。
我哥哥帮我做了下面的选择查询。然而,它相对较慢,约为 0.6 秒。
SELECT
subjects.id,
subjects.name,
subjects.link,
(
SELECT
COUNT(DISTINCT posts.id)
FROM
articles AS chapters,
articles AS posts
WHERE
chapters.parent = subjects.id AND(
posts.parent = chapters.id OR posts.parent = subjects.id
)
) AS child_count
FROM
articles AS subjects
WHERE
subjects.parent = 62
请帮助我提高性能。
非常感谢!!
最佳答案
这个逻辑很难理解,但我想你的意图是:
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
子句中的 关于mysql - 选择 MySQL 中所有子行的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56911028/