SQLAlchemy MySQL 复杂的 ORDER BY

SQLAlchemy MySQL complex ORDER BY

我有 2 个模型:

class Actor(db.Model):
    ...
    edited_at = db.Column(db.DateTime)

class Publication(db.Model):
    ...
    published_at = db.Column(db.DateTime, default=datetime.now)
    actor_id = db.Column(db.Integer, db.ForeignKey('actor.id'))

我需要按 actor.edited_at 或 publication.published_at 字段对演员进行排序(最新日期优先)。不确定我是否可以在 SQLAlchemy 中完成该操作,或者我需要使用原始 SQL(顺便说一句,原始 SQL 查询也是一种解决方案)。

我现在拥有的:

(db.session.query(models.Actor, func.max(models.Publication.published_at).label('latest')).join(models.Publication).group_by(models.Actor).order_by('latest desc', Actor.edited_at.desc())).all()

您可以使用 CASE expression 来选择要订购的内容,尽管这对索引不是特别友好:

from sqlalchemy import case

latest = func.max(models.Publication.published_at)

db.session.query(
        models.Actor,
        latest.label('latest')).\
    join(models.Publication).\
    group_by(models.Actor).\
    order_by(case(
        [(latest > models.Actor.edited_at, latest)],
        else_=models.Actor.edited_at).desc()).\
    all()

或者您可以使用 GREATEST():

order_by(func.greatest(latest, models.Actor.edited_at).desc())