2017-03-17 58 views
0

我希望能對MySQL有所幫助。Mysql視圖 - 在連接中選擇數據返回多於1行

這裏是我的架構的一部分(第一個表被稱爲「地王」): db_schema

sites.contractor鏈接到companiesornaturalperson.idCompaniesOrNaturalPerson

我建立一個視圖,以從兩張表中收集一些信息。 我需要將sites.latitude,sites.longitude和承包商名稱(companiesornaturalperson.name)放入我的視圖中。

所以我寫了:

CREATE VIEW `data_entry` AS 
SELECT   
    `sites`.`longitude` AS longitude, 
    `sites`.`latitude` AS latitude, 

    (SELECT `companiesornaturalperson`.`name` 
     FROM sites sites 
     INNER JOIN 
      companiesornaturalperson companiesornaturalperson ON sites.contractor = companiesornaturalperson.idCompaniesOrNaturalPerson 
    ) AS contractor_name 

FROM sites 

當我在我的地盤表有一列,這是工作好,但是我比成一排,導致我「子查詢返回多個1行」更錯誤。

我知道這是因爲我的連接在這些情況下帶來了多個值。問題是我不知道如何只返回一個值(某種「WHERE sites.id =網站的真實ID」)。我做了很多搜索,但仍然無法解決。

+0

什麼它應該返回,如果存在多個承包商?你只想每個經緯度返回1? – sgeddes

+0

只有一個承包商與每個網站相關聯。 – Max

回答

0

你可以做你想做的 - 可能 - 與相關子查詢:

CREATE VIEW `data_entry` AS 
    SELECT s.`longitude` AS longitude, 
      s.`latitude` AS latitude, 
      (SELECT cnp.`name` 
      FROM companiesornaturalperson cnp 
      WHERE s.contractor = cnp.idCompaniesOrNaturalPerson 
      ) AS contractor_name 
    FROM sites s; 

這可能仍然產生錯誤,如果有一個以上的匹配(不可能的,因爲名字的列)。

MySQL不允許FROM子句中的子查詢,但標量子查詢是允許的。

您還可以做這LEFT JOIN

CREATE VIEW `data_entry` AS 
    SELECT s.`longitude` AS longitude, 
      s.`latitude` AS latitude, 
      cnp.`name` as contractor_name 
    FROM sites s LEFT JOIN 
     companiesornaturalperson cnp 
     ON s.contractor = cnp.idCompaniesOrNaturalPerson; 
+0

我會嘗試你的第一個解決方案。我不能做第二次,因爲我需要從「companiesornaturalperson」表中選擇更多列:一個是ON sites.contractor = companiesornaturalperson.idCompaniesOrNaturalPerson;另一個與ON sites.landlord = companiesornaturalperson.idCompaniesOrNaturalPerson ... – Max

+0

好吧,第一個解決方案工作得很好。謝謝你,救命! – Max

0

你能試試嗎?

CREATE VIEW `data_entry` AS 
SELECT   
    `sites`.`longitude` AS longitude, 
    `sites`.`latitude` AS latitude, 
    `companiesornaturalperson`.`name` 
FROM sites  
INNER JOIN 
    companiesornaturalperson ON sites.contractor = companiesornaturalperson.idCompaniesOrNaturalPerson 
+0

是的,但我需要從「companiesornaturalperson」表中選擇更多列:一個是ON sites.contractor = companiesornaturalperson.idCompaniesOrNaturalPerson;另一個與ON sites.landlord = companiesornaturalperson.idCompaniesOrNaturalPerson ... – Max