2011-09-02 84 views
5

我搜索了很多主題,但沒有找到答案,或者問題太複雜。好吧。這是我的第一個問題。 這裏是SQLSqlAlchemy在子查詢中關閉

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

如何做到這一點子句中SQLAlchemy的?

WHERE ui.invited_by = u.id 

它可以在收藏中轉載嗎? SQL表達式? P.S.我知道這可以通過group_by完成。但我需要通過子查詢。

謝謝。

+0

爲什麼你需要一個子查詢? – SingleNegationElimination

+1

這是一個很好的問題。我需要在所有表格(2百萬行)中進行彙總。如果我嘗試'按'組'我的mysql開始構建temprorary表。它可以在我可以開始接收行之前做幾個小時。 另外,如果你想散裝,你也簡單地不能正常過濾分組查詢。 所以我只是得到ID和兩個選擇與聚合。如果我通過服務器端遊標讀取行,它只運行5分鐘。 – enomad

回答

1

我覺得這裏真的很棒的答案。但也太複雜了。首先,我想告訴關閉在SQL世界是相關。

這是不一樣的,但幫助我。

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

的SA查詢(使用子查詢)會給你你想要的結果:

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 

雖然子查詢是不是完全按照你描述的那樣,而是像:

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 

還是做不明白你爲什麼需要按照你描述的方式進行子查詢。