2013-02-26 10 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の忍者ではありません。私はこれについて長年頭を悩ましています。

お願いします!どんなポインタやアドバイスも大歓迎です。 SQLのバージョンについては

答えて

5

、SQLAlchemyの中で与えhttp://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

で「各グループから上位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

関連する問題