Выберите количество всех дочерних строк в MySQL - PullRequest
1 голос
/ 06 июля 2019

У меня есть таблица MySQL articles, в которой я организовал содержимое в следующей иерархии:

  1. Раздел
  2. Тема
  3. Глава
  4. Сообщение

Каждый элемент из вышеперечисленного находится в строке с полями: id, parent, name и т. Д.

Строка сообщения parent равна строке главы id, строка главы parent равна строке темы id и строке темы parent равна строке раздела id.

У меня нет более высокой иерархии, чем выше.

Мне нужно выбрать список предметов в данном разделе вместе с количеством всех детей по каждому предмету. Количество является суммой количества глав-потомков и их потомков, которые являются постами.

Мой брат помог мне со следующим запросом выбора. Однако он относительно медленный - ~ 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

Мне нужна помощь с улучшением производительности, пожалуйста.

Большое спасибо !!

1 Ответ

2 голосов
/ 06 июля 2019

Этой логике трудно следовать, но я думаю, что вы намереваетесь:

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может помешать оптимизатору.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...