SQLAlchemy:以多对多关系过滤运算符

时间:2014-12-05 23:34:56

标签: python sql sqlalchemy

我有两个有多对多关系的课程,ItemsCategories

类别具有相关值。

我想查询最高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 个答案:

答案 0 :(得分:1)

您需要GROUP BYHAVING而非WHERE来过滤聚合。

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

编辑:要同时包含没有任何类别的项目,我相信您可以执行外部联接并在OR子句中添加HAVING

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