MySQL和SQLAlchemy:为多个项目获取N个最近的评论

时间:2013-02-26 11:01:50

标签: 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忍者,而且几个小时以来一直在敲打我的脑袋。

请帮忙!任何指针或建议将不胜感激。

1 个答案:

答案 0 :(得分:5)

对于SQL版本,请参阅http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

中的“从每个组中选择前N行”部分

在SQLAlchemy中给出:

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()