2016-08-04 77 views
0

我的目標是,我有兩個表選擇計數,每介紹一個用戶,無論是「國家隊」或「公司」之間的關係SQLAlchemy的 - 如何從聯合查詢

如果有任何行,說「用戶名」表中的「管理員」,然後我想知道,否則,如果沒有行,那麼我也需要知道這一點。

我到目前爲止的內容如下(UserTeamLink和UserCompanyLink)是Orm標籤。

obj = UserTeamLink 
q1 = session.query(func.count(obj.type).label("cnt")).filter(obj.type == 'admin').filter(obj.user_id == id) ; str(q1) ; q1.all() 
obj = UserCompanyLink 
q2 = session.query(func.count(obj.type).label("cnt")).filter(obj.type == 'admin').filter(obj.user_id == id) ; str(q2) ; q2.all() 

my_union = q1.union_all(q2) 
query = select([func.sum(my_union.c.cnt).label("total_cnt")], from_obj=my_union) 
query.all() 

然而,行 「查詢=選擇([func.sum(my_union.c.cnt).label(」 total_cnt 「)],from_obj = my_union)」 符用:

AttributeError: 'BaseQuery' object has no attribute 'c' 

整個輸出如下:

>>> obj = UserTeamLink 
>>> q1 = session.query(func.count(obj.type).label("cnt")).filter(obj.type == 'admin').filter(obj.user_id == id) ; str(q1) ; q1.all() 
'SELECT count(user_team.type) AS cnt \nFROM user_team \nWHERE user_team.type = :type_1 AND user_team.user_id = :user_id_1' 
[(0L,)] 
>>> obj = UserCompanyLink 
>>> q2 = session.query(func.count(obj.type).label("cnt")).filter(obj.type == 'admin').filter(obj.user_id == id) ; str(q2) ; q2.all() 
'SELECT count(user_company.type) AS cnt \nFROM user_company \nWHERE user_company.type = :type_1 AND user_company.user_id = :user_id_1' 
[(0L,)] 
>>> 
>>> my_union = q1.union_all(q2) 
>>> query = select([func.sum(my_union.c.cnt).label("total_cnt")], from_obj=my_union) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'BaseQuery' object has no attribute 'c' 

是有辦法解決這一問題?

總之,我試圖做的是從兩個表中選擇計數,然後聯合到另一個表中,然後添加它們。

謝謝。

回答

0

您需要使用my_union作爲子查詢

my_union = q1.union_all(q2).subquery() 
query = select([func.sum(my_union.c.cnt).label("total_cnt")], from_obj=my_union) 
+0

謝謝!這實際上是我結束: ''' q_union = q1.union_all(q2) q_union_cnt = db.session.query(func.sum(q_union.subquery()。columns.cnt).label(「 total_cnt「)) admin_points = q_union_cnt.scalar() ''' –

0

這是我自己的問題解決了,我用了一個稍微不同的方法比@ RMN真實但我認爲兩者都應該工作:

q_union = q1.union_all(q2) 
    q_union_cnt = db.session.query(func.sum(q_union.subquery().columns.cnt).label("total_cnt")) 
    admin_points = q_union_cnt.scalar()