【问题标题】:SQLAlchemy: Select count of related many-to-many elementsSQLAlchemy:选择相关多对多元素的计数
【发布时间】:2012-05-18 05:42:44
【问题描述】:

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

【问题讨论】:

    标签: python sql many-to-many sqlalchemy


    【解决方案1】:

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

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

    【讨论】:

    • 难道 GROUP BY 也不能翻译成 distinct 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2012-06-14
    相关资源
    最近更新 更多