У меня есть таблица MySQL articles, в которой я организовал содержимое в следующей иерархии:
Каждый элемент из вышеперечисленного находится в строке с полями: 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
Мне нужна помощь в улучшении производительности, пожалуйста.
Большое спасибо!!
Если он медленный, то вы, вероятно, забыли создать показатель на parent.
Вы сказали "строка поста parent равна строке главы id", так почему posts.parent = subjects.id? Это никогда ничего не сопоставит, поскольку тема не может быть родителем сообщения.
вау, только что добавил индекс в родительский столбец. и теперь он обрабатывается за 0,02 секунды @Andreas, спасибо !!
Что касается этого posts.parent = subjects.id Я думаю, что мы должны были добавить это, потому что иначе он учитывал только сообщения. Мне также нужно было подсчитать строки глав. Несмотря на то, что он говорит posts.parent, на самом деле это строка главы, потому что родитель является предметом. Странно, как работает запрос, лол @Andreas
Грустно, что его закрывают, потому что этот вопрос отличается от того, который был опубликован как возможный дубликат. Меня беспокоит количество детей.






Этой логике трудно следовать, но я думаю, что вы намереваетесь:
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().ORs в корреляции или предложении ON могут помешать оптимизатору.работает отлично и занимает 0,015 секунды ... спасибо :)
Возможный дубликат Как создать иерархический рекурсивный запрос MySQL