5

複数のアイテムの最新のN個のコメントを取得するためのクエリを作成しようとしています。

現在、アイテムごとのクエリでアイテムをループしています。

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

しかし、これは本当に遅いです。

すべてのコメントを取得する単一のクエリが欲しいのですが、方法がわかりません。使ってみunionましたが、うまくいきません。order_byMySQL 、、、およびに問題があるよう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とORDERBYの誤った使用法」について文句を言います。

私はMySQLやSQLAlchemyの忍者ではなく、何時間もこれに頭を悩ませてきました。

助けてください!任意のポインタやアドバイスをいただければ幸いです。

4

1 に答える 1

5

SQLバージョンについては、http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-の「各グループから上位N行を選択する」セクションを参照してください。グループごとの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 に答える