2012-05-09 56 views
0

我在兩個表/對象之間有多對多的關係:標記和內容。 Tag.content是從標籤到具有該標籤的所有內容的關係。SQLAlchemy:選擇相關的多對多元素的計數

現在我想知道分配給標籤的內容對象的數量(對於所有標籤,否則我只是簡單地使用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())刪除不正確計數的結果,但它會這樣做,通過從結果集中刪除行,這是不是我想要的。

回答

1

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

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

GROUP BY是否也轉換爲不同? – Kristian

+0

我只按標籤分組。 – ThiefMaster