0

タグとコンテンツという2つのテーブル/オブジェクト間に多対多の関係があります。Tag.contentタグからこのタグを持つすべてのコンテンツへの関係です。

ここで、タグに割り当てられたコンテンツオブジェクトの数を調べたいと思います(すべてのタグについて、それ以外の場合は単に使用しますlen())。次のコードはほぼ機能します。

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

ただし、明らかな理由でゼロカウントが返されることはありません。使用されているため、タグごとに少なくとも1つの行がありLEFT JOINます。ただし、すべてのタグの正しいカウントを取得したいので、これは問題です。つまり0、タグが孤立している場合です。

したがって、これを実現する方法があるのではないかと思います。明らかに、データベースにn+1個のクエリを送信する必要はありません。純粋なSQLソリューションも問題ない可能性があります。通常、そのようなソリューションをSAにマッピングすることはそれほど難しくありません。

.filter(Tag.content.any())誤ったカウントで結果を削除しますが、結果セットから行を完全に削除することで削除します。これは私が望んでいることではありません。

4

1 に答える 1

1

Solved it. I needed to use DISTINCT in the COUNTs:

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