首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLalchemy distinct,order_by distinct列

SQLalchemy distinct,order_by distinct列
EN

Stack Overflow用户
提问于 2013-06-21 21:47:28
回答 1查看 6.8K关注 0票数 4

我正在使用SQLalchemy查询两个表,我想在查询中使用distinct特性,以获得一组唯一的客户id

我有以下疑问:

代码语言:javascript
复制
orders[n] = DBSession.query(Order).\
          join(Customer).\
          filter(Order.oh_reqdate == date_q).\
          filter(Order.vehicle_id == vehicle.id).\
          order_by(Customer.id).\
          distinct(Customer.id).\
          order_by(asc(Order.position)).all() 

如果您可以看到这里发生了什么,我正在查询特定日期、特定车辆的所有订单的Order表,这很好用。然而,一些客户可能在一个日期有多个订单。因此,我尝试过滤结果,使每个客户只列出一次。这样做很好,但是为了做到这一点,我必须首先按照distinct()函数所在的列对结果进行排序。我可以将第二个order_by添加到我想要对结果进行排序的列中,而不会导致语法错误。但它被忽略了,结果只是按Customer.id排序。

由于外键的设置方式,我需要在Order表上执行查询并连接到customer (而不是相反)。

我想要做的事情可以在一个查询中完成吗?或者我需要重新循环我的结果,以正确的顺序获得我想要的数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-22 03:25:22

您永远不需要“重新循环”-如果您的意思是将行加载到Python中,也就是说。您可能希望生成子查询并从中进行选择,这可以使用query.from_self().order_by(asc(Order.position))来实现。使用subquery()可以获得更具体的场景。

在这种情况下,我真的不知道你想要什么。如果客户有多个具有所请求的车辆id和日期的订单,您将获得两行,每个订单一行,每个订单行将引用客户。你到底想要什么呢?仅仅是每个客户组中的第一个订单行?我会这样做:

代码语言:javascript
复制
highest_order = s.query(Order.customer_id, func.max(Order.position).label('position')).\
                    filter(Order.oh_reqdate == date_q).\
                    filter(Order.vehicle_id == vehicle.id).\
                    group_by(Order.customer_id).\
                    subquery()

s.query(Order).\
    join(Customer).\
    join(highest_order, highest_order.c.customer_id == Customer.id).\
    filter(Order.oh_reqdate == date_q).\
    filter(Order.vehicle_id == vehicle.id).\
    filter(Order.position == highest_order.c.position)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17236934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档