首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用子查询的SQLAlchemy左联接

使用子查询的SQLAlchemy左联接
EN

Stack Overflow用户
提问于 2014-12-10 03:03:25
回答 1查看 6K关注 0票数 4

假设有一个表“post”包含博客文章,另一个表“收藏夹”将用户名链接到一个帖子。许多用户可以喜欢一篇文章,所以这种关系是一篇对很多人最喜欢的文章。

我试图找出将文章加入收藏夹的语法,但我只想要那些收藏夹,用户是当前的用户。

我想要这样的东西:

代码语言:javascript
运行
复制
current_user = 'testuser'
posts.query.outerjoin(favorites, and_(posts.post_id == favorites.post_id, favorites.username == current_user)).limit(10).all()

这让我非常接近,只不过"favorites.username == current_user“条件似乎基本上被忽略了。这就是我在实际SQL中要寻找的内容:

代码语言:javascript
运行
复制
SELECT *
FROM posts p
LEFT JOIN (
            SELECT * FROM favorites f WHERE f.user_id = 'testuser'
          ) ff ON ff.post_id = p.post_id
LIMIT 10

还值得一提的是,我在以下文章中定义了这种关系:

代码语言:javascript
运行
复制
favorites = db.relationship("favorites")

我在收藏夹上定义了外键,比如:

代码语言:javascript
运行
复制
post_id = db.Column(db.String(255), db.ForeignKey('posts.post_id'))

我如何在SQLAlchemy中实现这一点?

EN

回答 1

Stack Overflow用户

发布于 2014-12-10 06:56:48

实际上,您只需要用outerjoin替换join,过滤器就可以正常工作了。

另外,如果您的favorites表不包含其他信息,并且只链接了usersposts__,那么您应该考虑简单地定义一个http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html#many-to-many。在文档示例中,父/子将是您的用户/帖子。

更新-1:只是为了回答问题的第二部分给出您的评论,下面的查询应该给您一个想法:

代码语言:javascript
运行
复制
current_user = 2
subq = (db.session.query(favorites)
        .filter(favorites.user_id == current_user).subquery('ff'))
q = (db.session.query(posts, subq.c.score)
     .outerjoin(subq, subq.c.post_id == posts.post_id))
q = q.order_by(subq.c.score.desc())
for post, score in q:
    print(post, score)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27392661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档