我正在尝试编写一个查询来获取多个项目的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忍者,而且几个小时以来一直在敲打我的脑袋。
请帮忙!任何指针或建议将不胜感激。
答案 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()