2013-02-26 79 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