我有以下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_by
:http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html#sqlalchemy.orm.query.Query.count