python – SQLAlchemy过滤器查询由相关对象

python – SQLAlchemy过滤器查询由相关对象,第1张

概述使用 SQLAlchemy,我与两个表 – 用户和分数有一对多的关系.我试图根据他们的总分在过去X天的天数中查询排名前10位的用户. users: id user_name score scores: user score_amount created 我当前的查询是: top_users = DBSession.query(User).op 使用 SQLAlchemy,我与两个表 – 用户和分数有一对多的关系.我试图根据他们的总分在过去X天的天数中查询排名前10位的用户.
users:    ID    user_name    score  scores:    user     score_amount    created

我当前的查询是:

top_users = DBSession.query(User).options(eagerload('scores')).filter_by(User.scores.created > somedate).order_by(func.sum(User.scores).desc()).all()

我知道这显然不正确,这只是我最好的猜测.然而,在查看文档和谷歌搜索后,我找不到答案.

编辑:
如果我勾画出MySQL查询的样子,这可能会有所帮助

SELECT user.*,SUM(scores.amount) as score_increase FROM user left JOIN scores ON scores.user_ID = user.user_ID WITH scores.created_at > someday ORDER BY score_increase DESC
@R_403_6120@ 单连接方式,在所有用户列中添加了group_by,但如果您选择:MysqL将允许您仅对“ID”列进行分组:
sess.query(User,func.sum(score.amount).label('score_increase')).\               join(User.scores).\               filter(score.created_at > someday).\               group_by(User).\               order_by("score increase desc")

或者如果您只想要结果中的用户:

sess.query(User).\           join(User.scores).\           filter(score.created_at > someday).\           group_by(User).\           order_by(func.sum(score.amount))

上述两个都没有效率,因为您将所有“用户”列分组(或者您只使用MysqL的“只有几列”组,这仅是MysqL).为了最小化,子查询方法:

subq = sess.query(score.user_ID,func.sum(score.amount).label('score_increase')).\                  filter(score.created_at > someday).\                  group_by(score.user_ID).subquery()sess.query(User).join((subq,subq.c.user_ID==User.user_ID)).order_by(subq.c.score_increase)

相同场景的示例在ORM教程中:http://docs.sqlalchemy.org/en/latest/orm/tutorial.html#selecting-entities-from-subqueries

总结

以上是内存溢出为你收集整理的python – SQLAlchemy过滤器查询由相关对象全部内容,希望文章能够帮你解决python – SQLAlchemy过滤器查询由相关对象所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1207093.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存