2016-05-16 67 views
0

我一直在閱讀很多關於SQLAlchemy子查詢,不知何故,我認爲它應用於我的問題。SQLAlchemy子查詢,它們在這種情況下適用

我有以下2查詢

Query 1=>isp_ratings_per_service = db.session.query(func.count(Ratings.ratings_value).label('count_of_users'), 
               func.sum(Ratings.ratings_value).label('sum_of_ratings'), 
               func.avg(Ratings.ratings_value).label('avg_of_ratings'), 
               Isps.isp_name, Service_metric.metric_name, Services.service_name) \ 
     .filter(Service_metric_ratings.isp_id == Isps.isp_id) \ 
     .filter(Service_metric_ratings.ratings_value == Ratings.ratings_value) \ 
     .filter(Service_metric_ratings.metric_id == Service_metric.metric_id) \ 
     .filter(Service_metric_ratings.user_id == User.user_id) \ 
     .filter(Service_metric_ratings.service_id == Services.service_id) \ 
     .filter(Service_metric.metric_name == metric_name) \ 
     .filter(Services.service_name == service_name) \ 
     .group_by(Isps.isp_name) 

Query 2 => ratings_table_values = db.session.query(Ratings.rating_value, Ratings.rating_comment) 

我想使用存儲在該行的值

func.avg(Service_metric_ratings.ratings_id).label('avg_of_ratings'), 

到另一臺基於這樣

for i in isp_ratings_per_service: 
    (round(i.avg_of_ratings))) 
    ratings_table_values = Ratings.query.filter_by(rating_value=(round(i.avg_of_ratings))) 
這個值來選擇數據

是否可以使用子查詢將它們置於一個查詢中,目前的問題是它創建第2次迭代的燒瓶模板,是不是給我結果,我想如下

{% for i in ratings_table_values %} 
<tr> 
    <td>{{ i.rating_value}}</td> 
    <td>{{ i.rating_comment}}</td> 
{% endfor %} 

{% for i in isp_ratings_per_service %} 
blah blah blah 
{% endfor %} 

我寧願當一個查詢會給我我想要的結果,

+1

看起來您需要對「評級」進行連接。您似乎在「評級」表中對「評級」的ID進行求和並取代了「rating_value」列的ID。 – univerio

+0

@univerio是的,你是對的,我已經編輯了我的查詢相應的,我覺得它是工作的,因爲ratings_id和rating_value具有相同的值....不同的是,ratings_id是主鍵,所以我擺脫了這一列,將rating_value作爲該表的主鍵 – Chamambom

回答

0

我設法解決自己的問題像這樣,查詢是分開的,不需要連接和完美的工作。我在Jinja開發了自己的邏輯

{% for i in isp_ratings_per_service %} 
    <td>{{ i.isp_name }}</td> 
    <td>{{ i.metric_name }}</td> 
    <td>{{ i.service_name }}</td> 
    <td>{{ i.count_of_users }}</td> 
    <td>{{ i.sum_of_ratings }}</td> 
    <td>{{ i.avg_of_ratings|round|int }}</td> 
     {% for m in ratings_table_values %} 
      {% if (m.ratings_value) ==(i.avg_of_ratings|round|int)%} 
       <td>{{ m.ratings_comment}}</td> 
      {% endif %} 
     {% endfor %} 
    </tr> 
    {% else %} 
    <tr><td colspan="7"><em>No entries here so far</em></td></tr> 
    {% endfor %}