3

我是 MySQL 的初学者,到目前为止我只需要使用“多对一个”表链接。我现在需要一个“多对多”链接,但不确定如何做。据我了解,我需要第三张桌子。

基本上我有一张满是公园的桌子和一张满是文章链接的桌子。在显示单个公园详细信息的网页上,我需要查询以查找该公园的任何附加文章。通常我会在另一个表中使用 park_id 列并使用它进行链接,但这里的问题是每篇文章都可以链接到许多公园。

示例查询将是:

SELECT * FROM tpf_features  
Where park_id = 7

但是一篇文章的 park_id 可能是 3、7、13、23。

有人能指出我建立这种关系并正确查询的正确方向吗?

谢谢

4

2 回答 2

7

您应该使用第三个表并关联他们的 ID:(仅使用 ID 创建表)

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 中只关联一次。

于 2013-08-02T00:16:34.757 回答
3

实际上,您将需要第三个“链接”表,它应该只包含两列:一列是公园 ID,另一列是文章 ID。尽管这些 id 在它们各自的原始表中可能是唯一的主键,但它们在链接表中不必是唯一的。

这第三个链接表允许每个原始表中的 id 多次出现,而不会与它们在这些原始表中的唯一性发生冲突。虽然每个单独的 id 在链接表中多次出现,但 park/article 的每个组合只会出现一次。

然后,为了选择所有与 park 7 相关的文章,您只需从链接表中选择 park_id = 7 的所有行

SELECT * FROM linking_tbl
WHERE park_id = 7
于 2013-08-02T00:19:41.060 回答