2017-03-17 61 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