假设有一个表“post”包含博客文章,另一个表“收藏夹”将用户名链接到一个帖子。许多用户可以喜欢一篇文章,所以这种关系是一篇对很多人最喜欢的文章。
我试图找出将文章加入收藏夹的语法,但我只想要那些收藏夹,用户是当前的用户。
我想要这样的东西:
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中要寻找的内容:
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还值得一提的是,我在以下文章中定义了这种关系:
favorites = db.relationship("favorites")我在收藏夹上定义了外键,比如:
post_id = db.Column(db.String(255), db.ForeignKey('posts.post_id'))我如何在SQLAlchemy中实现这一点?
发布于 2014-12-10 06:56:48
实际上,您只需要用outerjoin替换join,过滤器就可以正常工作了。
另外,如果您的favorites表不包含其他信息,并且只链接了users和posts__,那么您应该考虑简单地定义一个http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html#many-to-many。在文档示例中,父/子将是您的用户/帖子。
更新-1:只是为了回答问题的第二部分给出您的评论,下面的查询应该给您一个想法:
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)https://stackoverflow.com/questions/27392661
复制相似问题