2016-04-21 36 views
0

遍历从MySQL结果我已在SQLAlchemy的CODE获取副本,当我尝试使用Python

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 

,如果我做以下一对这样的

for data in my_query: 
    print data.isp_name 

的my_query循环,这将让我重复

ISP1 
ISP2 
ISP3 
ISP1 
ISP1 
ISP2 
ISP3 
ISP1 

等依此类推。

我猜测它通过其他表的循环,以及存在的给我复制

注:这些表是无关的,我选择所有数据,所以我可以用它DROPDOWNS我FORM

+0

这就是您在交叉连接时发生的情况(“笛卡尔产品”)。如果你不使用正确的'join'语法,你期待什么? –

+0

你能向我们展示你的连接中每个表的列吗? –

+0

请注意,这些表是不相关的,我想要实现的是选择这些特定的字段,并能够在表单中引用它们,例如使用数据库中的数据填充的表单中的下拉列表。 ,isp_name,isp_descpription服务表有id,service_name – Chamambom

回答

2

你可能要找的东西就是这样的。

警告,我不知道你的模式是什么样的,所以这里的名字(也可能是实际的结构)可能是关闭的。

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 

你在做什么由互联网服务供应商表的外键域表(服务和服务指标)加盟,并在收视率表由ISP ID。例如,您可以获得与isps相关的服务,而不是上面提到的“Cartesian Product”Gordon,您可以在其中检索与每个isp连接的每个服务。

为了实现在SQLAlchemy的一个JOIN,使用带有join子句select_from条款为精氨酸,例如:http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html#sqlalchemy.orm.join

末集团子句将聚集你的数据,只有一个ISP的每行返回。

然而,那么你必须汇总可能会针对单个ISP返回多个结果的表(例如,评级)。

我们通过使用集合函数(如AVG和COUNT)从一组值中提取有意义的数据来做到这一点。

为此在SQLAlchemy中,使用countgroup_by条款:http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html#sqlalchemy.orm.query.Query.count

+0

我希望能够使用SQLALCHEMY语法,因为我使用它作为我的基础SQL库... – Chamambom

+0

@Chamambom你会想要使用JOIN语法和'select_from'子句,如下所述:http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html#sqlalchemy.orm.join –

0

那么这里是另一个想法。你如何在你的数据库中创建一个视图,将所有你想要的值放到2列中?

CREATE 
ALGORITHM = UNDEFINED 
DEFINER = [email protected] 
SQL SECURITY DEFINER 
VIEW `v` 
AS 
select `isps`.`isp_name` AS `VALUE`,'ISP_NAME' AS `TYPE` from `isps` 
union all 
select `ratings`.`rating_value` AS `VALUE`,'RATING_VALUE' AS `TYPE` from `ratings` union all 
select `services`.`service_name` AS `VALUE`,'SERVICE_NAME' AS `TYPE` from `services` 
union all 
select `service_metric`.`metric_name` AS `VALUE`,'METRIC_NAME' AS `TYPE` from `service_metric` 

现在你应该能够在python中查询那个视图。当你循环他们时,你不应该得到重复的信息。 如果您想在窗体中填充下拉列表,您可以简单地向查询中添加一个过滤器,并从视图中选择“TYPE”。

相关问题