SQLAlchemy MySQL复杂的ORDER BY

时间:2018-02-08 12:52:07

标签: python mysql sqlalchemy sql-order-by flask-sqlalchemy

我有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字段(最新日期优先)来订购actor。不确定我是否可以在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()

1 个答案:

答案 0 :(得分:1)

您可以使用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())