如何在一个SQL语句中加入此查询?

时间:2009-12-29 11:38:05

标签: sql mysql

假设我有这些表格,包含以下字段:

公司:company_id |名字| num_employees

companies_countries :company_id | COUNTRY_ID

国家/地区:country_id | country_iso_code

假设这是一个1:1的关系: 当我获取所有公司时,如何将country_iso_code直接加入公司记录集?我想我需要两个联接?

8 个答案:

答案 0 :(得分:6)

一个简单的例子:

select c.name, n.country_iso_code
from companies c,
companies_countries x,
countries n
where x.company_id = c.company_id
and n.country_id = x.country_id

修改

要了解JOIN的简介,请查看SQL JOIN

答案 1 :(得分:3)

SELECT 
    companies.company_id, 
    companies.name, 
    companies.num_employees, 
    countries.country_iso_code
FROM
    companies
LEFT JOIN
    companies_countries ON (companies_countries.company_id = companies.company_id)
LEFT JOIN
    countries ON (countries.country_id = companies_countries.country_id);

使用LEFT JOIN而不是INNER JOIN或隐式联接的查询,即使没有分配国家/地区,也会返回公司。另一方面,使用INNER JOIN的查询会跳过companies_countries中没有指定国家/地区的公司。

请注意,您的设计意味着每家公司都可以分配多个国家/地区。如果您只想为每家公司强制执行一个国家/地区,只需在country_id表格中添加companies列即可。您不需要companies_countries表。

答案 2 :(得分:2)

SELECT co.*, cu.country_iso_code 
FROM companies co 
LEFT JOIN companies_countries cc ON cc.company_id = co.company_id
LEFT JOIN countries c ON c.country_id = cc.country_id

为什么LEFT JOIN而不是其他示例中的WHERE条件?连接表(companies_countries)通常不用于1:1关系 - 它是过度标准化。

当你的关系不再是1:1时:

SELECT co.*, GROUP_CONCAT(cu.country_iso_code)
FROM companies co 
LEFT JOIN companies_countries cc ON cc.company_id = co.company_id
LEFT JOIN countries c ON c.country_id = cc.country_id

这将返回

之类的结果
CompanyA | Canada,USA,Mexico
CompanyB | Ireland,UK,Japan

答案 3 :(得分:2)

select name, country_iso_code 
from companies left join companies_countries 
   on (companies.company_id = companies_countries.company_id)
left join countries 
   on (companies_countries.country_id = countries.country_id)

答案 4 :(得分:2)

这不是1:1关系。一个国家可以拥有更多的公司。

这是1:N关系(由于某种原因使用两个关系表实现),或M:N关系描述了跨国公司。

如果这是1:N关系,您可以将country_code字段放入companies表格,在这种情况下,只需一次加入即可:

SELECT  *
FROM    companies co
LEFT JOIN
        countries cn
ON      cn.country_code = co.country_code

您的设计适用于1:NM:N关系,在这种情况下,需要两个连接:

SELECT  co.*, cn.*
FROM    companies co
LEFT JOIN
        company_countries cc
ON      cc.company_id = co.company_id
LEFT JOIN
        countries cn
ON      cn.country_code = cc.country_code

如果这是1:N关系,您应该在company_id表中PRIMARY KEY company_country

如果这是M:N关系,则应在PRIMARY KEY

上制作合成company_country (company_id, country_code)

您可能希望在我的博客中阅读有关实体关系模型与其关系实现之间差异的文章:

答案 5 :(得分:1)

是的,你需要两个连接。

您可以创建一个视图,然后假冒一个加入......

答案 6 :(得分:1)

select companies.* from countries, companies_countries, companies where countries.country_id=companies_countries and companies_countries.company_id=company_id and countries.country_iso_code='xxxx'

其中xxxx是您要匹配的ISO代码

答案 7 :(得分:1)

select c.company_id, c.name, c.num_employees, co.county_iso_code from
companies c, companies_countries cc, countries co
where c.company_id = cc.company_id 
and cc.country_id = co.country_id