我的要求是在省 - 语言和城市 - 语言之间建立许多关系。
所以我确实喜欢这个
省 PK:身份证, 名称
语言 PK:身份证, 名称
Provinces_Languages province_id languages_id
同样适用于城市:
城市 PK:身份证, 名称
使用相同的语言表
Cities_Languages cities_id languages_id
现在,我想在省和城市之间建立一个ToMany / ManytoOne关系
省 PK:身份证, 名称
城市 PK:身份证, 名称
我在理解如何连接它们时遇到问题? 因为省“id”已被 Provinces_Languages 用作外键。 和城市“id”也被 Cities_Languages 用作外键
请指导我如何链接这些实体?
答案 0 :(得分:0)
没有问题 - 将<{1}}添加到您的城市表格中,并将其设为省级 .id的外键。
答案 1 :(得分:0)
您实际上可以将Provinces_Languages
和Cities_Languages
表合并为一个。只需添加type
字段即可。请参阅以下示例(SQL Fiddle):
CREATE TABLE Provinces(id int auto_increment primary key,
name varchar(100));
CREATE TABLE Cities(id int auto_increment primary key,
name varchar(100),
prov_id int);
CREATE TABLE Languages(id int auto_increment primary key,
name varchar(100));
CREATE TABLE ProvCity_Languages(provcity_id int,
languages_id int,
type varchar(10));
INSERT INTO Provinces (name) VALUES
('Province1'),('Province2');
INSERT INTO Cities (name, prov_id) VALUES
('City1', 1),('City2', 1),('City3', 2),('City4', 2);
INSERT INTO Languages (name) VALUES
('English'),('Spanish'),('French'),
('Chinese'),('Pig Latin');
INSERT INTO ProvCity_Languages
(provcity_id, languages_id, type) VALUES
(1, 1, 1),(1, 2, 1),(2, 1, 1),(1, 4, 2),
(2, 1, 2),(3, 1, 2),(3, 2, 2),(4, 5, 2),
(4, 4, 2),(4, 3, 2);
SELECT p.name AS ProvName, c.name AS CityName,
GROUP_CONCAT(DISTINCT pll.name SEPARATOR ', ') AS ProvLang,
GROUP_CONCAT(DISTINCT cll.name SEPARATOR ', ') AS CityLang
FROM Provinces p
JOIN Cities c on p.id = c.prov_id
JOIN ProvCity_Languages pl on p.id = pl.provcity_id AND pl.type = 1
JOIN Languages pll on pl.languages_id = pll.id
JOIN ProvCity_Languages cl on c.id = cl.provcity_id AND cl.type = 2
JOIN Languages cll on cl.languages_id = cll.id
GROUP BY p.name, c.name
我展示了上面的SELECT查询,只是为了向您展示您可以对结果做任何您想做的事情。结果将类似于以下内容: