2011-09-02 16 views
5

He buscado muchos temas y no encontré la respuesta, o la pregunta era demasiado compleja. Así que está bien. Esta es mi primera pregunta. Aquí está el SQLCierre SqlAlchemy en la subconsulta

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

cómo hacer esta cláusula en sqlalchemy?

WHERE ui.invited_by = u.id 

¿Se puede reproducir en colecciones? expresiones sql? P.S. Sé que se puede hacer por group_by. Pero lo necesito por subconsulta.

Gracias.

+0

¿por qué necesita una subconsulta? – SingleNegationElimination

+1

Es una buena pregunta. Necesito un poco de agregación en toda la tabla (2 millones de filas). Si intento 'group by' mi mysql comienza a construir la tabla de temprorary. puede hacerlo horas antes de que pueda comenzar a recibir filas. Además, simplemente no se puede filtrar normalmente las consultas de agrupación si se desean bultos. Así que acabo de obtener la identificación y dos selecciones con la agregación. Y funciona solo 5 minutos si busco filas a través de los cursores del lado del servidor. – enomad

Respuesta

1

Encuentro aquí una respuesta realmente increíble. Pero también demasiado complicado. En primer lugar, quiero decir que el cierre en el mundo sql es CORRELACIÓN.

Esto NO es lo mismo pero me ayuda.

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

La consulta SA (usando subconsulta) le dará los resultados que desea:

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 

aunque la subconsulta no es exactamente como usted la describe, sino más bien algo así como:

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 

todavía lo hacen Sin embargo, no entiendo por qué necesita una subconsulta tal como lo describió.