我正在使用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表上执行查询并加入客户(而不是反过来)。
我想在一个查询中做什么?或者我是否需要重新循环我的结果以获得正确顺序的数据?
答案 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)