Собесов

LeetCode SQL — second-degree followers: считаем пользователей-«узлы»

SQLГрафы и самосоединенияСредняяMiddle

Условие

Таблица Follow(followee, follower) — направленные подписки. Найдите всех пользователей, которые сами имеют подписчиков, и для них верните число подписчиков. Сортировка по followee.

(Адаптация LeetCode 614 «Second Degree Follower»: формально — у кого есть и подписчики, и кого они сами подписаны хоть на кого-то. Здесь упростим до «у кого есть подписчики».)

Решение

Простой вариант

SELECT followee, COUNT(DISTINCT follower) AS num
FROM Follow
WHERE followee IN (SELECT DISTINCT follower FROM Follow)
GROUP BY followee
ORDER BY followee;

Логика: оставляем только тех followee, которые сами кого-то подписаны.

Через INNER JOIN

SELECT f1.followee, COUNT(DISTINCT f1.follower) AS num
FROM Follow f1
JOIN Follow f2 ON f2.follower = f1.followee
GROUP BY f1.followee
ORDER BY f1.followee;

f2.follower = f1.followeef1.followee фигурирует как follower в другой записи → значит «второго уровня».

Подводные камни

  1. COUNT(DISTINCT follower). Если в таблице возможны дубли пар (никакой PK), нужно DISTINCT. В LC обычно PK есть — но в проде закладывайтесь.
  2. JOIN без DISTINCT. Дубли могут возникнуть от множественности подписок f1.followee. COUNT(DISTINCT ...) спасает.
  3. Самоподписки. Если follower = followee — в реальных данных бывает. Решите по условию: исключать или нет (обычно — исключать через WHERE follower <> followee).

Эталонный ответ

Follow JOIN Follow ON f2.follower = f1.followee + COUNT(DISTINCT f1.follower) + GROUP BY f1.followee.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти