0

我有两个表/对象之间的多对多关系:标签和内容。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())删除计数不正确的结果,但它会通过从结果集中完全删除行来做到这一点,这不是我想要的。

4

1 回答 1

1

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

cnt = db.func.count(db.distinct(Content.id))
于 2012-05-09T18:23:08.307 回答