SQLalchemy distinct,order_by不同的列

时间:2013-06-21 13:47:28

标签: python sqlalchemy

我正在使用SQLalchemy查询两个表,我想在查询中使用不同的功能,以获得一组唯一的客户ID

我有以下查询:

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() 

如果你能看到这里发生了什么,我正在查询订单表,查看特定日期的所有订单,对于特定的车辆,这样可以正常工作。但是,某些客户可能会有一个以上的订单。所以我试图过滤结果只列出每个客户一次。这工作正常,但是为了做到这一点,我必须首先通过具有distinct()函数的列对结果进行排序。我可以在第二个order_by中添加我希望结果排序的列,而不会导致语法错误。但它会被忽略,结果只是由Customer.id排序。

由于外键的设置方式,我需要在Order表上执行查询并加入客户(而不是反过来)。

我想在一个查询中做什么?或者我是否需要重新循环我的结果以获得正确顺序的数据?

1 个答案:

答案 0 :(得分:3)

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

在这种情况下,我无法确切地说出你的目标。如果客户有多个具有所请求的车辆ID和日期的订单,您将获得两行,每个订单一个,每个订单行将引用客户。你究竟想要什么呢?只是每个客户群中的第一个订单行?我会这样做:

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)