2013-06-21 25 views
3

我查詢了兩條表與SQLAlchemy的,我想用不同的功能上我的查詢,得到了一套獨特的客戶ID的SQLAlchemy的不同,ORDER_BY不同的列

我有以下查詢:

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表上執行我的查詢並加入到客戶中(而不是其他方式)。

我想在一個查詢中做什麼?或者我是否需要重新循環我的結果才能以正確的順序獲取我想要的數據?

回答

3

你永遠不需要「重新循環」 - 如果你的意思是把行加載到Python中,那就是。您可能想要生成子查詢並從中進行選擇,您可以使用query.from_self().order_by(asc(Order.position))來實現。您可以使用更具體的場景subquery()

在這種情況下,我真的不知道你要去的。如果客戶有多個訂單,並且有所需的車輛編號和日期,則會得到兩行,每個訂單一行,每個訂單行將引用客戶。你究竟想要什麼呢?只是每個客戶羣中的第一個訂單行?我會這樣做:

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) 
+0

啊啊謝謝,這是一個更好的方法。我加入了s.qeury order_by(Order.position).all(),並且解決了這個問題,使用兩個查詢要好得多 – crooksey