Сгруппируйте Book по author_id, отфильтруйте группы через HAVING count(id) > 5 и выберите соответствующие объекты Author.
SQLAlchemy запрос: выбор авторов, у которых книг более пяти
Сгруппируйте 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 полезен для связи и других запросов, но реальный план зависит от размера таблиц.