python – SQLAlchemy过滤器查询由相关对象
发布时间:2020-12-16 23:22:46 所属栏目:Python 来源:网络整理
导读:使用 SQLAlchemy,我与两个表 – 用户和分数有一对多的关系.我试图根据他们的总分在过去X天的天数中查询排名前10位的用户. users: id user_name score scores: user score_amount created 我当前的查询是: top_users = DBSession.query(User).options(eagerl
使用
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() 我知道这显然不正确,这只是我最好的猜测.然而,在查看文档和谷歌搜索后,我找不到答案. 编辑: 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 解决方法
单连接方式,在所有用户列中添加了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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 最小化具有numpy数组作为参数的python函数
- python – Matplotlib第二个带有转换值的x轴
- Django实战(一)之简单Demo
- python – 使用time.mktime的日期/时间转换似乎是错误的
- Python3网络爬虫实战-1、请求库安装:Requests、Selenium、
- SCons:如何在scons脚本中调用自定义的python函数并进行正确
- python – 具有MultiIndex的Pandas DataFrame:按DateTime级
- Python SSLError:客户端错误(EOF发生违反协议),服务器端错
- python – 使用OpenCV补偿自动白平衡
- Python多维/嵌套字典数据无限遍历的实现