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.
Est-ce que GROUP BY ne se traduit pas aussi par distinct? – Kristian
Je ne fais que grouper par le tag. – ThiefMaster