2012-05-09 27 views
0

我在两个表/对象之间有多对多的关系:标记和内容。 Tag.content是从标签到具有该标签的所有内容的关系。SQLAlchemy:选择相关的多对多元素的计数

现在我想知道分配给标签的内容对象的数量(对于所有标签,否则我只是简单地使用len())。下面的代码几乎工作:

cnt = db.func.count() 
q = db.session.query(Tag, cnt) \ 
    .outerjoin(Tag.content) \ 
    .group_by(Tag) \ 
    .order_by(cnt.desc()) 

但是,它绝不会返回一个零计数原因很明显 - 有每个标签至少一行都由于使用了LEFT JOIN后。这是一个问题,因为我想要得到所有标签的正确计数 - 即0如果标签是孤立的。

所以我想知道是否有办法做到这一点 - 显然不发送n + 1查询到数据库。纯SQL解决方案也可能没问题,通常将这样的解决方案映射到SA并不难。

.filter(Tag.content.any())删除不正确计数的结果,但它会这样做,通过从结果集中删除行,这是不是我想要的。

回答

1

解决了它。我需要在COUNT中使用DISTINCT:

cnt = db.func.count(db.distinct(Content.id)) 
+0

GROUP BY是否也转换为不同? – Kristian

+0

我只按标签分组。 – ThiefMaster