2013-02-26 94 views
5

我正在嘗試編寫一個查詢以獲取多條項目的N條最新評論。MySQL和SQLAlchemy:爲多個項目獲取N條最新評論

目前,我通過項目循環,每個項目的查詢:

for i in itemIds: 
    Comment.query.filter_by(itemId=i).order_by(Comment.id.desc()).limit(3) 

但這實在是太慢了。

我想要一個單一的查詢獲取所有的評論,但不知道如何。我試過使用union,但還沒有得到它的工作。我看起來有MySQL的問題,order_byunion。我正在嘗試一些效果:

a = Comment.query.filter_by(itemId=1).order_by(Comment.id.desc()).limit(3) 
b = Comment.query.filter_by(itemId=2).order_by(Comment.id.desc()).limit(3) 
u = union_all(a,b) 
DB.session.query(Comment).select_from(u).all() 

但是這並不奏效。它抱怨'不正確使用UNION和ORDER BY'。

我不是一個MySQL或SQLAlchemy忍者,並且一直在我的頭上打了幾個小時。

請幫忙!任何指針或建議將不勝感激。

回答

5

對於SQL版本,請參閱在http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

,其給出了SQLAlchemy的「選擇從每個組的頂部N行」部分:

c2 = aliased(Comment) 
query = session.query(Comment).filter(
      session.query(func.count(c2.id))\ 
       .filter(c2.id >= Comment.id)\ 
       .filter(c2.item_id == Comment.item_id)\ 
       .order_by(c2.id.desc())\ 
       .correlate(Comment)\ 
       .as_scalar() <= 3)\ 
    .filter(Comment.item_id.in_(itemIds)).all() 
+0

真棒..這做的。非常感謝! – aspiringwebninja 2013-02-27 07:25:25