Flask-SQLAlchemy 如何单次查询关联产品数大于指定值的basket数据
解决方案
你可以通过HAVING子句对分组后的聚合结果直接做过滤,Flask-SQLAlchemy对应提供了having()方法实现该逻辑,修改后的查询语句如下,全程仅执行一次数据库查询,且直接返回符合条件的Basket对象列表:
# 替换下方的THRESHOLD为你指定的数量阈值 results = db.session.query(Basket).\ join(Product, Basket.id == Product.basket_id).\ group_by(Basket.id).\ having(func.count(Product.basket_id) > THRESHOLD).\ all()
补充说明
HAVING是SQL中专门用于过滤GROUP BY聚合结果的子句,不可用普通WHERE子句替代:WHERE是分组前对单条数据做过滤,HAVING是分组后对聚合计算的结果做过滤- 分组时改用
Basket.id作为分组依据,兼容性更好,避免部分数据库严格模式下因为分组字段和查询字段不匹配报错 - 如果你需要同时拿到对应Basket的关联产品数量,可使用如下写法,返回的结果中可以直接通过
product_count别名取数量值:
results = db.session.query( Basket, func.count(Product.basket_id).label('product_count') ).\ join(Product, Basket.id == Product.basket_id).\ group_by(Basket.id).\ having(func.count(Product.basket_id) > THRESHOLD).\ all() # 取值示例 for basket, count in results: print(basket.id, count)
内容的提问来源于stack exchange,提问作者absent 63
相关产品推荐
相关产品推荐

