5

我正在尝试编写一个查询来获取多个项目的 N 个最新评论。

目前,我正在遍历这些项目,每个项目都有一个查询:

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

但这真的很慢。

我想要一个获取所有评论的查询,但不知道如何。我试过使用union,但还没有让它工作。我似乎存在 MySQL order_by、 和union. 我正在尝试以下效果:

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 忍者,我已经为此苦苦思索了好几个小时。

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

4

1 回答 1

5

对于 SQL 版本,请参阅http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-中的“从每个组中选择前 N 行”部分每组-in-sql/

在 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()
于 2013-02-27T04:31:19.377 回答