【问题标题】:SQLalchemy distinct, order_by different columnSQLalchemy distinct,order_by 不同的列
【发布时间】:2013-06-22 03:25:21
【问题描述】:

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

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

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    你永远不需要“重新循环”——如果你的意思是将行加载到 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)
    

    【讨论】:

    • 啊,谢谢,这是一个更好的方法。我添加到 s.qeury order_by(Order.position).all() 并解决了它,更好的主意使用两个查询
    • 虽然这解决了 OP 的具体问题,但当您只想按 id 进行区分时,它并不能回答一般问题,而是按另一列排序(比如说客户的姓氏)
    • 这个问题不是关于 SQLAclhemy 而是关于 PostgreSQL 特殊的“DISTINCT ON”语法。问一个单独说明 SQL 的新问题,并将其标记为 postgresql。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多