2012-05-09 3 views
0

J'ai une relation de plusieurs à plusieurs entre deux tables/objets: Tag et Content. Tag.content est la relation entre un tag et tout le contenu qui a cette balise.SQLAlchemy: Sélection du nombre d'éléments plusieurs-à-plusieurs associés

Maintenant, je voudrais savoir le nombre d'objets de contenu assignés à une balise (pour toutes les balises, sinon j'utiliserais simplement len()). Le code suivant fonctionne presque:

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

Cependant, il ne reviendra un compte zéro pour des raisons évidentes - il y a au moins une ligne par étiquette, après tout en raison du LEFT JOIN utilisé. Ceci est un problème, car je voudrais obtenir le nombre correct pour toutes les balises - c'est-à-dire 0 si une balise est orpheline.

Je me demande donc s'il existe un moyen d'y parvenir - évidemment sans envoyer de requêtes n + 1 à la base de données. Une solution pure-SQL peut également convenir, en général, il n'est pas trop difficile de faire correspondre une telle solution à SA.

.filter(Tag.content.any()) supprime les résultats avec le nombre incorrect, mais il le fera en supprimant les lignes du jeu de résultats tout à fait ce qui n'est pas ce que je veux.

Répondre

1

Résolu. J'avais besoin d'utiliser DISTINCT dans les COUNTs:

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

Est-ce que GROUP BY ne se traduit pas aussi par distinct? – Kristian

+0

Je ne fais que grouper par le tag. – ThiefMaster

Questions connexes