SqlAlchemy在子查询中关闭
问题描述:
我搜索了很多主题,但没有找到答案,或者问题太复杂。好吧。这是我的第一个问题。 这里是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完成。但我需要通过子查询。
谢谢。
答
我觉得这里真的很棒的答案。但也太复杂了。首先,我想告诉关闭在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
答
的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
还是做不明白你为什么需要按照你描述的方式进行子查询。
为什么你需要一个子查询? – SingleNegationElimination
这是一个很好的问题。我需要在所有表格(2百万行)中进行汇总。如果我尝试'按'组'我的mysql开始构建temprorary表。它可以在我可以开始接收行之前做几个小时。 另外,如果你想散装,你也简单地不能正常过滤分组查询。 所以我只是得到ID和两个选择与聚合。如果我通过服务器端游标读取行,它只运行5分钟。 – enomad