我有以下 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 相关的服务,而不是上面提到的“笛卡尔积”Gordon,例如,您在戈登中检索与每个 ISP 结合的每个服务。
要在 SQLAlchemy 中完成 JOIN
,请使用 select_from
子句和 join
子句作为参数,例如:http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html#sqlalchemy.orm.join
最后的 GROUP 子句将对数据进行聚类,以便每行仅返回一个 ISP。
但是,您必须聚合可能针对单个 ISP 返回多个结果的表(例如评级)。
我们通过使用 AVG 和 COUNT 等聚合函数从一组值中提取有意义的数据来实现这一点。
要在 SQLAlchemy 中执行此操作,请使用带有 group_by
子句的 count
:http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html#sqlalchemy.orm.query.Query.count
关于python - 当我尝试使用 python 迭代 mysql 的结果时出现重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36757584/