gpt4 book ai didi

mysql - 选择 MySQL 中所有子行的计数

转载 作者:搜寻专家 更新时间:2023-10-30 22:23:44 25 4
gpt4 key购买 nike

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

  1. 部分
  2. 主题
  3. 章节
  4. 发布

上面的每一项都在一行中,包含以下字段:idparentname

帖子行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() 更昂贵。
  • 关联或 ON 子句中的
  • OR 会阻碍优化器。

关于mysql - 选择 MySQL 中所有子行的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56911028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com