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())
我有 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())