2014-12-05 245 views
1

我有兩個類,具有多對多關係,ItemsCategoriesSQLAlchemy:在多對多關係中對運算符進行過濾

類別具有關聯的值。

我想查詢所有Items,其中最高的Categorie.value(如果有的話)小於給定值。

到目前爲止,我已經嘗試查詢是這樣的:

from sqlalchemy.sql import functions 
Session.query(Items).join(Categories,Items.categories).filter(functions.max(Categories.value)<3.14).all() 

但在這種情況下,我得到一個(OperationalError) misuse of aggregate function max()錯誤。

有沒有辦法讓這個查詢?

回答

1

您需要GROUP BYHAVING而不是僅對WHERE進行過濾聚合。

Session.query(Items).join(Items.categories).group_by(Items.id).having(functions.max(Categories.value)<3.14).all() 

編輯:也包括沒有任何類別的項目,我相信你可以做一個外部聯接,把HAVING子句中OR

Session.query(Items).outerjoin(Items.categories).group_by(Items.id)\ 
.having((functions.max(Categories.value)<3.14) | (functions.count(Categories.id)==0))\ 
.all() 
+0

謝謝。我承認我最初的問題不夠精確。有些項目沒有任何類別,我也想回顧一下。所以也許我的意圖是找到所有沒有任何類別的項目,其關聯值大於X. – ascobol 2014-12-06 10:43:19

+0

我明白了,更新的答案 – xli 2014-12-06 18:27:54

+0

非常感謝。你的回答對我對sqlalchemy和sql的理解非常有幫助。 – ascobol 2014-12-07 00:13:32

相關問題