Напишите SQL-запрос для получения всех постов пользователей с количеством подписчиков больше 500
Что проверяют
Умеете ли соединять таблицы и понимаете ли разницу между готовым счётчиком в колонке и агрегатом по таблице подписок. Вопрос почти всегда продолжается разговором про индексы и план запроса, так что чистого синтаксиса мало.
Как отвечать
Начните с уточнения схемы, это часть ожидаемого ответа. Если счётчик денормализован и лежит в users, запрос простой:
SELECT p.id, p.user_id, p.content, p.created_at
FROM posts p
JOIN users u ON u.id = p.user_id
WHERE u.followers_count > 500;Если подписки хранятся отдельной таблицей, считать придётся агрегатом, и фильтр по агрегату живёт в HAVING:
SELECT p.id, p.user_id, p.content
FROM posts p
WHERE p.user_id IN (
SELECT user_id
FROM subscriptions
GROUP BY user_id
HAVING count(*) > 500
);Дальше скажите про производительность: индекс на posts.user_id обязателен, на users.followers_count полезен при высокой селективности. Упомяните, что денормализованный счётчик быстрее читается, но требует поддержки при подписке и отписке, и именно этот размен обычно и хотят услышать.
Где спотыкаются
Соединяют posts с таблицей подписок напрямую без группировки. Каждый пост возвращается столько раз, сколько у автора подписчиков. DISTINCT сверху прячет дубли в выдаче, но база всё равно строит и сортирует огромный промежуточный набор.
Пишут WHERE count(*) > 500. Агрегат в WHERE недоступен, потому что фильтрация строк идёт до группировки. Нужен HAVING или подзапрос, и это стоит объяснить порядком выполнения, а не заученным правилом.
Путают count(*) и count(column): второй не считает NULL, и на таблице с неполными данными числа разойдутся. Ещё оставляют SELECT p.*, хотя на собеседовании ждут явного списка колонок: со звёздочкой любой новый столбец молча уезжает в ответ API.