2013-02-26 31 views
5

Tôi đang cố viết truy vấn để nhận được N nhận xét gần đây nhất cho nhiều mục.MySQL và SQLAlchemy: nhận được N ý kiến ​​gần đây cho nhiều mục

Hiện nay, tôi đang lặp qua các mục với một truy vấn mỗi mục:

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

Nhưng điều này là rất chậm.

Tôi muốn có một truy vấn duy nhất nhận tất cả nhận xét nhưng không biết cách thực hiện. Tôi đã thử sử dụng union nhưng chưa nhận được nó để làm việc. Tôi xuất hiện có vấn đề với MySQL, order_byunion. Tôi đang cố gắng điều gì đó ảnh hưởng của:

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

Nhưng điều đó không hiệu quả. Nó phàn nàn về 'Sử dụng sai UNION và ORDER BY'.

Tôi không phải là một ninja MySQL hay SQLAlchemy, và đã đập đầu tôi vào điều này hàng giờ liền.

Trợ giúp xin vui lòng! Bất kỳ gợi ý hay lời khuyên nào sẽ được đánh giá cao.

Trả lời

5

Đối với phiên bản SQL, vui lòng xem "Chọn N hàng đầu từ mỗi nhóm" trong http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

mang đến cho trong 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

tạo ảnh vui nhộn .. mà hiện nó. Cám ơn rất nhiều! – aspiringwebninja

Các vấn đề liên quan