Mysql视图-选择join中的数据返回超过1行
我非常感谢您对MySQL的帮助 这是我的模式的一部分,第一个表称为站点: sites.contractor链接到公司或自然人。ID公司或自然人 我正在构建一个视图,以便从这两个表中收集一些信息。 我需要将sites.latitude、sites.longitude和承包商名称companyesornaturalperson.name放入我的视图中 于是我写道:Mysql视图-选择join中的数据返回超过1行,mysql,sql,database,join,view,Mysql,Sql,Database,Join,View,我非常感谢您对MySQL的帮助 这是我的模式的一部分,第一个表称为站点: sites.contractor链接到公司或自然人。ID公司或自然人 我正在构建一个视图,以便从这两个表中收集一些信息。 我需要将sites.latitude、sites.longitude和承包商名称companyesornaturalperson.name放入我的视图中 于是我写道: CREATE VIEW `data_entry` AS SELECT `sites`.`longitude`
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
当我的站点表中有一行时,这工作正常,但当我有多行时,这会导致子查询返回多行错误
我明白这是因为我的加入在这些情况下带来了不止一个价值。问题是我不知道如何只返回一个值,某种类型的WHERE sites.id=站点的真实id。我做了很多搜索,但仍然无法解决它。你能试试这个吗
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
您可以使用相关子查询(可能)执行您想要的操作:
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子句中的子查询,但允许标量子查询
您也可以通过左连接执行此操作:
如果存在多个承包商,它应该返回什么?您是否只希望每个lat/long返回1个?每个站点只会有一个关联的承包商。是的,但我需要从companyesornaturalperson表中选择更多列:one with ON sites.contractor=companyesornaturalperson.idcompanyesornaturalperson;另一个与ON sites.land=companiesornaturalperson.idCompaniesOrNaturalPerson…我将尝试您的第一个解决方案。我不能做第二个,因为我需要从companyesornaturalperson表中选择更多的列:一个带有ON sites.contractor=companyesornaturalperson.idcompanyesornaturalperson;另一个与ON-sites.land=companiesornaturalperson.idCompaniesOrNaturalPerson…好的,第一个解决方案非常有效。谢谢你,救命恩人!
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;