4

我正在使用 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 表执行查询并加入客户(而不是反过来)。

我想在一个查询中完成吗?或者我是否需要重新循环我的结果才能以正确的顺序获取我想要的数据?

4

1 回答 1

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)
于 2013-06-21T19:25:21.630 回答