Войти Регистрация
Data base

22. Объявления в корневых категориях с подкатегориями

Средняя

Категории образуют дерево: у корневой parent_id равен NULL, глубина не ограничена («Транспорт → Автомобили → С пробегом»). Объявления могут висеть на любом уровне.

Для каждой корневой категории верните name и listings — число активных объявлений (status = active) в ней и во всех её потомках. Корень без объявлений — с нулём. Порядок — по listings по убыванию, затем по name.

В работе: Счётчики на главной: «Транспорт — 1,2 млн объявлений» считаются по всему поддереву.

Таблицы

categories — дерево категорий

КолонкаТипЧто значит
category_idintключ
parent_idintродитель, NULL у корня
nametextназвание

listings — объявления

КолонкаТипЧто значит
listing_idintключ
category_idintкатегория любого уровня
statustextactive / closed

Пример: данные

categories · 7 строк

category_idparent_idname
1NULLТранспорт
21Автомобили
32С пробегом
42Новые
5NULLНедвижимость
65Квартиры
7NULLХобби и отдых

listings · 7 строк

listing_idcategory_idstatus
13active
23active
34active
42active
51closed
66active
76closed

Ожидаемый ответ

namelistings
Транспорт4
Недвижимость1
Хобби и отдых0
Как проверяем Ваш запрос выполняется в PostgreSQL 16 прямо в браузере на 4 наборах данных: пример выше и скрытые — с NULL, повторами и пустыми таблицами. Нужен один SELECT, можно с WITH. Сравниваем значения по порядку колонок, названия колонок могут быть свои. Порядок строк важен — как задано в условии.
name, listings
рекурсивный CTELEFT JOINGROUP BY

Источник: на данных Авито: дерево категорий. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.