Python SQLAlchemy MySQL复杂顺序

Python SQLAlchemy MySQL复杂顺序,python,mysql,sqlalchemy,sql-order-by,flask-sqlalchemy,Python,Mysql,Sqlalchemy,Sql Order By,Flask Sqlalchemy,我有两种型号: 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')) 我需要按a

我有两种型号:

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()
您可以使用a来选择要订购的内容,尽管这对索引不是特别友好:

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()
或者,您可以使用:

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

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()
或者,您可以使用:


正是我想要的。我尝试了case语句,但我并没有猜到在查询之外使用了最新的变量。谢谢一个很晚才添加的,但是完全忽略了使用,它可以取代更详细的CASE表达式。这正是我想要的。我尝试了case语句,但我并没有猜到在查询之外使用了最新的变量。谢谢后来添加了一个,但完全忽略了使用,它可以替换更详细的CASE表达式。