python - 当我尝试使用 python 迭代 mysql 的结果时出现重复项

标签 python mysql

我有以下 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/

相关文章:

mysql - 如何使用 Tire 从 Elasticsearch 索引中获取数据而不访问数据库

php - 如何将变量从数据库查询传递到 PHP 函数

Python导入困惑

python - 从 anchor 估计平滑的 3D 坐标变换

python - PyQt4 嵌套类 - "RuntimeError: underlying C/C++ object has been deleted"

python - 为什么 "j"能够识别范围变化,而 "i"却不能?

python - 比较两个电子名片

c# - Entity Framework 删除所有行而不是一行

字段、EAV 等中的 MySQL 多个值

mysql - 将 IN 子查询重写为 JOIN