SQLAlchemy:选择相关多对多元素的计数

时间:2012-05-09 16:57:38

标签: python sql many-to-many sqlalchemy

我有两个表/对象之间的多对多关系:标记和内容。 Tag.content是标记与具有此标记的所有内容之间的关系。

现在我想找出分配给标签的内容对象的数量(对于所有标签,否则我只是使用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 个答案:

答案 0 :(得分:1)

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

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