2013-02-26 15 views
5

Próbuję napisać zapytanie, aby uzyskać najnowsze komentarze do wielu pozycji.MySQL i SQLAlchemy: pobieranie N ostatnich komentarzy do wielu pozycji

Obecnie jestem pętli poprzez elementów z kwerendy za sztukę:

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

Ale to jest bardzo powolny.

Chciałbym mieć jedno zapytanie, które zawiera wszystkie komentarze, ale nie wiem jak. Próbowałem używać union, ale nie udało mi się go uruchomić. Wygląda na to, że są problemy z MySQL, order_by i union. Próbuję coś z tego powodu:

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

Ale to nie działa. Skarży się na "nieprawidłowe użycie UNION i ORDER BY".

Nie jestem ninja MySQL lub SQLAlchemy i od wielu godzin walę w to.

Pomoc, proszę! Wszelkie wskazówki i porady będą bardzo mile widziane.

Odpowiedz

5

Dla wersji SQL można znaleźć w „Zaznacz górny N wierszy z każdej grupy w sekcji” http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

co daje w 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() 
+0

niesamowite .. to robi. Dzięki wielkie! – aspiringwebninja

Powiązane problemy