SQLAlchemy запрос: выбор авторов, у которых книг более пяти

Сгруппируйте Book по author_id, отфильтруйте группы через HAVING count(id) > 5 и выберите соответствующие объекты Author.

Короткий ответ

Что ответить на собеседовании

Сгруппируйте Book по author_id, отфильтруйте группы через HAVING count(id) > 5 и выберите соответствующие объекты Author.

Подробный разбор

Ответ с пояснениями

Условие

Требуется получить список всех авторов, у которых число написанных книг превышает пять. Для этого использовать модели Author и Book. В модели Author присутствуют поля id и name, а в модели Book — id, name и author_id, где author_id является внешним ключом, ссылающимся на Author. Сформировать запрос с помощью SQLAlchemy.


Author:
    id
    name

Book:
    id
    name
    author_id

Ответ

Сгруппируйте Book по author_id, отфильтруйте группы через HAVING count(id) > 5 и выберите соответствующие объекты Author.

В стиле SQLAlchemy 2.x удобно использовать подзапрос идентификаторов:

from sqlalchemy import select, func

prolific_ids = (
    select(Book.author_id)
    .group_by(Book.author_id)
    .having(func.count(Book.id) > 5)
)
stmt = select(Author).where(Author.id.in_(prolific_ids))
authors = session.scalars(stmt).all()

HAVING фильтрует результат группировки, в отличие от WHERE, применяемого к исходным строкам. Условие строгое: автор с пятью книгами не попадёт в выборку. Подзапрос возвращает по одной строке на автора, поэтому внешняя выборка не размножает объекты. Индекс Book.author_id полезен для связи и других запросов, но реальный план зависит от размера таблиц.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее