当前位置: 首页 > 面试题库 >

使用sqlalchemy从相关表中仅选择一行

袁宜民
2023-03-14
问题内容

假设我有一个Author表和一个Post表,每个Author可以有多个Post。

现在,随着单SQLAlchemy的查询,我想我所有的活跃作者和最近发布的帖子为每个。

我一直在尝试通过获取子列表来加入作者的工作列表,使用子查询将结果分组在一起,如下所示:

subquery = DBSession.query(Author.id, func.max(Post.publish_date).label("publish_date")) \
    .join(Post.author) \
    .filter(Post.state == 'published') \
    .filter(Author.state == 'active') \
    .group_by(Author.id) \
    .subquery()

query = DBSession.query(Post) \
    .options(joinedload(Post.author)) \
    .join(Post.author) \
    .join(subquery, and_(Author.id == subquery.c.id, 
                         Post.publish_date == subquery.c.publish_date))

但是,如果我有两个来自同一发布日期的Author帖子,而这些帖子是最新的Posts,则意味着我得到那个Author在我的结果列表中出现两次。虽然我可以使用第二个子查询来消除重复(使用func.max(Post.id)),但这似乎是一种非常错误的方式。有更好的方法来解决这个问题吗?

(再次,我正在寻找一个查询,所以我试图避免在Author表上查询,然后遍历并对结果中的每个Author进行Post查询。)


问题答案:

我将按以下方式进行操作:

LastPost = aliased(Post, name='last')
last_id = (
    session.query(LastPost.id)
    .filter(LastPost.author_id == Author.id)
    .order_by(LastPost.publish_date.desc())
    .order_by(LastPost.id.desc())
    .limit(1)
    .correlate(Author)
    .as_scalar()
)

query = (
    DBSession.query(Author, Post)
    .outerjoin(Post, Post.id == last_id)
)

for author, last_post in query:
    print(author, last_post)

如您所见,结果是atuple(Author, LastPost)。如果只希望作者至少有一位,请
更改outerjoin为。 另外,我不会预先加载任何关系,以免造成任何混乱。joinPost Author.post



 类似资料:
  • 问题内容: 我只想通过“ where子句”从数据库中选择(并返回)一个字段。代码是: 这将失败,并且回溯是: 如何选择并仅返回“ id”列?我也尝试了其他几种方法,但也失败了。是“ load_only”正确的选项吗? 问题答案: 一个对象接受实体查询作为位置参数,所以只是通过它: 返回第一个结果的第一个元素;如果未找到任何行,则返回None。它为多行引发异常。 表示仅应加载实体的给定基于列的属性,

  • 问题内容: 我有一个表和一个表,对于每个有付款的用户,表中可能有多个关联的付款。我想选择所有有付款的用户,但只选择他们最近的付款。我正在尝试使用此SQL,但之前从未尝试过嵌套SQL语句,所以我想知道自己在做什么错。感谢帮助 问题答案: 您需要有一个子查询,以获取每个日期的最新日期。

  • 在同一个表的操作上我需要从表中删除。JPA查询是 我得到了这个错误: 根原因org.hibernate.hql.ast.querySyntaxException:意外标记:(第1行附近,第109列[DELETE FROM com.bcits.bfm.model.electricityledgerEntity a中的a.elledgerId IN(SELECT P.elledgerId FROM(S

  • 问题内容: 我是来自python背景的Golang的新手,所以尝试了解新的和不同的概念。我正在尝试创建相关字段,然后从数据库中选择它们。 楷模: 创建表和行并从数据库中选择 打印: 两个问题: 为什么我需要选择creditCard作为单独的变量而不是使用点符号? 我在公司上遇到错误,并且没有点符号或相关工作。我该如何取回? 问题答案: 根据文件,你需要设置以进行自动预加载工作。因此,将检索用户的行

  • 问题内容: 嘿,我在PostgreSql中有2个表: 和一些数据: 文件: 更新: 因此,所有更新都指向同一文档,但是所有更新的日期都不同。 我想做的是从文档表中进行选择,但还要包括基于日期的最新更新。 这样的查询应如何显示?这是我目前拥有的,但我列出的是所有更新,而不是我需要的最新更新: 包括; 我在查询中需要这个的原因是我想按更新模板中的日期排序! 编辑:此脚本已大大简化,因此我应该能够创建一

  • 我有一个关系N x 1,,post->user有如下关系: post.php(模型): 注意:我不希望在我的post.php模型文件中有任何“硬编码”的内容,因为在不同的情况下,我可能希望同一关系有不同的列,所以我希望将关系保留在上