我正在使用SQLalchemy查询两个表,我想在查询中使用distinct特性,以获得一组唯一的客户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() 如果您可以看到这里发生了什么,我正在查询特定日期、特定车辆的所有订单的Order表,这很好用。然而,一些客户可能在一个日期有多个订单。因此,我尝试过滤结果,使每个客户只列出一次。这样做很好,但是为了做到这一点,我必须首先按照distinct()函数所在的列对结果进行排序。我可以将第二个order_by添加到我想要对结果进行排序的列中,而不会导致语法错误。但它被忽略了,结果只是按Customer.id排序。
由于外键的设置方式,我需要在Order表上执行查询并连接到customer (而不是相反)。
我想要做的事情可以在一个查询中完成吗?或者我需要重新循环我的结果,以正确的顺序获得我想要的数据?
发布于 2013-06-22 03:25:22
您永远不需要“重新循环”-如果您的意思是将行加载到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)https://stackoverflow.com/questions/17236934
复制相似问题