在一个查询语句中想要对某个字段进行计算(统计/求和),可以用子查询实现。
例如2张表,一张表Book
里面是数据信息,另一个张表BookTrading
里面记录每次书籍售出数据,现在要获取书籍信息以及统计每种书籍各卖了多少钱
1 2 3 4
|
trading_subquery = db.session.query(func.ifnull(func.sum(BookTrading.total_price),0) .filter(BookTrading.book_id == Book.id, BookTrading.status>0) .correlate(Book).as_scalar() book_query = db.session.query(Book, trading_subquery).filter(Book.status>0).all()
|
User
一个用户的介绍人,及其介绍的数量
1 2 3
|
subquery = db.session.query(User.introducer_id, func.count('*').label('introduce_count')).group_by(User.introducer_id).subquery()
db.session.query(User.name, subquery.c.introduce_count).outerjoin(subquery, User.id==subquery.c.introducer_id).all()
|
合并查询 union
例如2张表,TMOrder
和 JDOrder
2张表存储的字段部分相同,现在我需要取2个表的数据合并且根据创建时间进行排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
tm_query = db.session.query(TMOrder.id.label("order_id"), TMOrder.price.label("order_price"), TMOrder.create_time.label("create_time")), func.ifnull(None, 1).label("shop_type") .filter(TMOrder.user_id=1) jd_query = db.session.query(JDOrder.id.label("order_id"), JDOrder.price.label("order_price"), JDOrder.create_time.label("create_time")), func.ifnull(None, 2).label("shop_type") .filter(TMOrder.user_id=1) total_order_query = union(course_query, training_query).alias('order')
order_query = db.session.query(total_order_query).order_by(total_order_query.c.create_time())
|
多条件查询对应常量 case
例如查询Book
是否有销量 BookTrading
1 2 3 4
|
trading_subquery = db.session.query(func.count()) .filter(BookTrading.book_id == Book.id, BookTrading.status>0) .correlate(Book).as_scalar() book_query = db.session.query(Book, case(whens=((trading_subquery, 1),), else_=0).label("is_selled")).filter(Book.status>0).all()
|
近期评论