@toobinks

Как правильно сделать запрос с order_by и distict?

Не могу сообразить как сформировать простой запрос.
Есть родитель, у него могут быть дети. Нужно выбрать детей по одному от каждого родителя, ребёнок должен иметь последнюю дату создания. Порядок должен быть отсортирован по убыванию даты создания ребёнка.
Так как запрос используется в пагинации flask-sqlalchemy, то нужно всё это иметь в запросе.

class Parent(Model):

    id = Column(Integer, primary_key=True)
    created_at = Column(DateTime, default=datetime.utcnow)
    chils = relationship(Child, backref="parent")


class Child(Model):

    id = Column(Integer, primary_key=True)
    created_at = Column(DateTime, default=datetime.utcnow)
    parent_id = Column(ForeignKey('parent.id'))


p1 = Parent()
p1.childs.append(
    Child()
)
p1.childs.append(
    Child()
)

p2 = Parent()
p2.childs.append(
    Child()
)
p2.childs.append(
    Child()
)
db.session.add(p1)
db.session.add(p2)

query = Child.query
query = query.distinct(Child.parent_id)
query = query.order_by(Child.parent_id.desc(), Child.created_at.desc())
parents = query.all()

Во так выбираются правильно, но порядок не тот который нужен: дата создания ребёнка вразброс:
27.08.2017 14:00
27.08.2017 13:54
27.08.2017 13:55
  • Вопрос задан
  • 148 просмотров
Решения вопроса 1
@toobinks Автор вопроса
Сделал так

query = Child.query
query = query.with_entities(func.max(Child.id))
query = query.group_by(Child.parent_id)
subquery = query.subquery()

query = Child.query
query = query.filter(Child.id.in_(subquery))
query = query.order_by(Child.id.desc())
childs = query.all()
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы