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

标签 mysql sql database

我有一个 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/

相关文章:

php - 给出警告 : mysqli_query() expects parameter 1 to be mysqli, null。当我尝试将数据库作为 OOP 对象连接时

python - python 中的 mysql 连接器不工作

mysql - 在MySQL中所有新创建的数据库中创建表

php - 在唯一键上使用空值执行 "INSERT...ON DUPLICATE KEY UPDATE"的变通解决方案

sql-server - 如何跟踪数据库连接泄漏

php - 一般错误 : 1366 Incorrect integer value ( QUERY EXEPTION )

sql - 导出数据 - IBM Data Studio DB2

mysql - 或者在列中设置 Null 值

Java:存储数据库中的信息。哪些 Collection 合适?

mysql - 更改 SQL 数据库服务器