我有以下SQLALCHEMY代码

    my_query = db.session.query(Isps.isp_name, Ratings.rating_value,
    services.service_name, Service_metric.metric_name)


当我转储查询时,上面的内容基本上转化为这个

SELECT isps.isp_name AS isps_isp_name, ratings.rating_value
AS   ratings_rating_value, services.service_name
AS services_service_name,      service_metric.metric_name
AS service_metric_metric_name
FROM isps, ratings, services, service_metric


如果我像这样在my_query上执行for循环

for data in my_query:
    print data.isp_name


这会给我重复

ISP1
ISP2
ISP3
ISP1
ISP1
ISP2
ISP3
ISP1


等等等等。

我猜是通过给我重复来遍历其他表

注意:这些表是不相关的,我正在选择所有数据,以便可以在表单上使用它的下拉列表

最佳答案

您可能正在寻找的是这样的东西。

警告,我不知道您的架构是什么样子,因此此处的名称(可能还有实际的结构)可能已关闭。

SELECT i.isp_name,
    COALESCE(AVG(r.rating_value), 'n/a') AS avg_rating,
    COUNT(DISTINCT r.rating_id) AS num_ratings,
    s.service_name,
    sm.metric_name
FROM isps AS i
    LEFT JOIN ratings AS r ON r.isp_id = i.isp_id
    INNER JOIN services AS s ON i.service_id = s.service_id
    INNER JOIN service_metric AS sm ON s.metric_id = sm.metric_id
GROUP BY i.isp_name


您正在做的是通过isps表中的外键加入域表(服务和服务度量标准),并通过isp id将其加入评级表。

这将为您提供查询结果的相对性-您将获得与isp相关的服务,而不是上面提到的“ Cartesian Product” Gordon,例如,在其中检索与每个isp关联的每个服务。

要在SQLAlchemy中完成JOIN,请使用select_from子句和join子句作为arg,例如:http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html#sqlalchemy.orm.join

最后的GROUP子句将对您的数据进行聚类,以便每行仅返回一个ISP。

但是,您必须汇总可能针对单个ISP返回多个结果的表(例如,评分)。

我们使用诸如AVG和COUNT之类的聚合函数从一组值中提取有意义的数据来做到这一点。

若要在SQLAlchemy中执行此操作,请在count子句中使用group_byhttp://docs.sqlalchemy.org/en/rel_1_0/orm/query.html#sqlalchemy.orm.query.Query.count

10-08 08:36
查看更多