【问题标题】:Ordering by subquery in SQLAlchemy在 SQLAlchemy 中按子查询排序
【发布时间】:2013-07-05 04:43:55
【问题描述】:

我正在尝试选择按最新回复时间降序排列的最新线程(线程)(回复是帖子模型,这是标准论坛查询)。在 SQL 中,我会这样写:

SELECT * FROM thread AS t ORDER BY (SELECT MAX(posted_at) FROM post WHERE thread_id = t.id) DESC

我如何在 SQLAlchemy 中做这样的事情?我尝试过这样的事情:

scalar = db.select[func.max(Post.posted_at)].where(Post.thread_id == Thread.id).as_scalar()
threads = Thread.query.order_by(scalar.desc()).all()

但我似乎不明白标量是如何工作的。第五次阅读文档无济于事。有人可以帮我在 SQLAlchemy 中编写这样的查询吗?我在这个应用程序中使用了 flask-sqlalchemy 和 MySQL。

【问题讨论】:

  • 除了 select 后面缺少的括号,这正是它的工作原理,order_by(select().(..).as_scalar().desc()),Thread.id 应该与父级相关自动查询。您需要在此处详细说明什么是“不起作用”。

标签: python mysql sqlalchemy flask-sqlalchemy


【解决方案1】:

对我来说看起来不错,这是一个测试:

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Thread(Base):
    __tablename__ = 'thread'

    id = Column(Integer, primary_key=True)


class Post(Base):
    __tablename__ = 'post'

    id = Column(Integer, primary_key=True)
    thread_id = Column(Integer, ForeignKey('thread.id'))
    posted_at = Column(String)

s = Session()

scalar = select([func.max(Post.posted_at)]).where(Post.thread_id == Thread.id).as_scalar()

q = s.query(Thread).order_by(scalar.desc())

print q

输出(注意我们只是在这里打印 SQL):

SELECT thread.id AS thread_id 
FROM thread ORDER BY (SELECT max(post.posted_at) AS max_1 
FROM post 
WHERE post.thread_id = thread.id) DESC

看起来很像您的查询

【讨论】:

  • 谢谢,暂时从 PyCharm 转移到 Sublime Text,这就是结果 :) 抛出的错误看起来查询无效,而不是语法错误。
猜你喜欢
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多