2011-09-02 26 views
5

Tôi đã tìm kiếm nhiều chủ đề và không tìm thấy câu trả lời hoặc câu hỏi quá phức tạp. Được thôi. Đây là câu hỏi đầu tiên của tôi. Đây là SQLSqlAlchemy đóng trong subquery

SELECT parent.*, 
(
    SELECT COUNT(*) 
    FROM child 
    WHERE parent.id = child.parent_id 
) 
FROM parent 

Cách thực hiện điều khoản này trong sqlalchemy?

WHERE ui.invited_by = u.id 

Nó có thể được sao chép trong bộ sưu tập không? sql biểu thức? P.S. Tôi biết rằng nó có thể được thực hiện bởi group_by. Nhưng tôi cần bằng truy vấn phụ.

Cảm ơn bạn.

+0

tại sao bạn cần truy vấn phụ? – SingleNegationElimination

+1

Đây là một câu hỏi hay. Tôi cần một số tập hợp trong tất cả các bảng (2 Hàng triệu hàng). Nếu tôi cố gắng 'nhóm bởi' mysql của tôi bắt đầu xây dựng bảng temprorary. nó có thể làm những giờ đó trước khi tôi có thể bắt đầu nhận hàng. Ngoài ra bạn chỉ đơn giản là không thể lọc bình thường nhóm các truy vấn nếu bạn muốn bulks. Vì vậy, tôi chỉ nhận được ID và hai lựa chọn với tổng hợp. Và nó chỉ chạy 5 phút nếu tôi tìm nạp các hàng thông qua con trỏ phía máy chủ. – enomad

Trả lời

1

Tôi tìm thấy câu trả lời thực sự tuyệt vời ở đây. Nhưng cũng quá phức tạp. Trước hết tôi muốn nói rằng việc đóng cửa trong thế giới sql là CORRELATION.

Điều này KHÔNG giống nhau nhưng giúp tôi.

pparent = Parent.__table__.alias('pparent') # using table directly to alias. 

subquery = s.query(count(Child.id)).join(pparent) # usual thing but use aliased table. 

s.query(Parent, subquery.filter(Parent.id == pparent.id).correlate(Parent).as_scalar()) #magic 
1

Truy vấn SA (sử dụng subquery) sẽ cung cấp cho bạn kết quả mong muốn:

sq = session.query(Child.parent_id, func.count(Child.id).label("child_num")).group_by(Child.parent_id) 
sq = sq.subquery() 
# use outerjoin to have also those Parents with 0 (zero) children 
q = session.query(Parent, sq.c.child_num).outerjoin(sq) 
q = q.filter(Parent.id == 1) # add your filter here: ui.invited_by = u.id 
for x in q.all(): 
    print x 

mặc dù subquery là không chính xác như bạn mô tả, mà là một cái gì đó như:

SELECT  parent.*, 
      anon_1.child_num AS anon_1_child_num 
FROM  parent 
LEFT JOIN (SELECT child.parent_id AS parent_id, 
        count(child.id) AS child_num 
      FROM child 
      GROUP BY child.parent_id 
      ) AS anon_1 
     ON parent.id = anon_1.parent_id 

Tuy nhiên làm không hiểu tại sao bạn cần truy vấn phụ theo cách bạn mô tả.