2011-09-02 47 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 

还是做不明白你为什么需要按照你描述的方式进行子查询。