假设我有这些表格,包含以下字段:
公司:company_id |名字| num_employees
companies_countries :company_id | COUNTRY_ID
国家/地区:country_id | country_iso_code
假设这是一个1:1的关系: 当我获取所有公司时,如何将country_iso_code直接加入公司记录集?我想我需要两个联接?
答案 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:N
和M: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