我是MySQL的初学者,到目前为止,我只需要使用“多对一”表链接。我现在需要一个“多对多”链接,但我不确定如何做到这一点。据我所知,我需要第三张表。
基本上我有一张满是公园的桌子和一张桌子上的文章链接。在显示单个公园详细信息的网页上,我需要查询查找该公园的任何附件。通常我会在另一个表中使用park_id列并使用它来链接,但这里的问题是每篇文章都可以链接到许多公园。
示例查询将是:
SELECT * FROM tpf_features
Where park_id = 7
但是一篇文章的park_id可能是3,7,13,23。
有人能指出我正确的方向来建立这种关系并正确查询。
谢谢
答案 0 :(得分:7)
你应该使用第三个表并关联他们的id' s: (仅使用id' s创建表格)
Create table parks(
park_id integer,
primary key (park_id)
);
Create table articles(
article_id integer,
primary key (article_id)
);
CREATE TABLE cross_table(
article_id integer,
park_id integer,
Primary Key (article_id,park_id),
Foreign Key (article_id) REFERENCES articles(article_id),
Foreign Key (park_id) REFERENCES parks(park_id)
);
然后,当您想要找到与公园相关的文章的相关信息时,您可以这样做:
SELECT a.*
FROM cross_table c, articles a
WHERE c.article_id = a.article_id
AND c.park_id = 7;
这将返回与park_id = 7相关的所有文章的所有信息。
主键,确保每篇文章都有唯一的ID,每个公园都有唯一的ID,并且它们只在cross_table中关联一次。
答案 1 :(得分:3)
实际上,您需要第三个“链接”表,该表应该只包含两列:一个是park id,另一个是item ID。虽然这些ID可能是各自原始表中唯一的主键,但它们在链接表中不一定是唯一的。
第三个链接表允许每个原始表中出现多次ID,而不会与这些原始表中的唯一性冲突。虽然每个单独的id很多次出现在链接表中,但park / article的每个组合只会出现一次。
然后,为了选择与park 7相关的所有文章,您只需要选择链接表中park_id = 7的所有行
SELECT * FROM linking_tbl
WHERE park_id = 7