2016-04-21 33 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」。

相關問題