mysql多对多关系
多对多就是双向的一对多,即A表中的一行数据对应B表中的多行数据,相同的B表中的一行数据也对应A表中的多行数据。 例如文章和标签表 一篇文章有多个标签,一个标签可以关联多个文章 那么我们怎么记录这
mysql多对多关系
发布时间:2023-10-19 (2023-10-19)

多对多就是双向的一对多,即A表中的一行数据对应B表中的多行数据,相同的B表中的一行数据也对应A表中的多行数据。

例如文章和标签表

一篇文章有多个标签,一个标签可以关联多个文章

那么我们怎么记录这样的关系呢

文章表

id title
1 零基础入门python开发
2 零基础入门golang开发

标签表

id title
1 python
2 golang

假设,文章1的标签有1和2,我们如何表示呢?

我们很容易就能想到,通过第三张表去记录他们之间的关系

连接表

文章id 标签id
1 1
1 2
create table article
(
    id    int(11) primary key auto_increment,
    title varchar(16)
);
create table tag
(
    id    int(11) primary key auto_increment,
    title varchar(16)
);
create table article_tag
(
    article_id int(11),
    tag_id     int(11),
    PRIMARY KEY (article_id, tag_id),
    foreign key (article_id) references article (id),
    foreign key (tag_id) references tag (id)
)

查询

insert into article(title)value ('入门golang开发');
insert into tag(title)values('前端'),('后端');
insert into article_tag values (1, 1),(1,2);


# 查询入门golang开发的标签有哪些
select article.title, t.title from article left join article_tag a on article.id = a.article_id left join tag t on a.tag_id = t.id where article.title = '入门golang开发';

select title from tag where id in (select article_tag.tag_id from article_tag where article_id in (select article.id from article where article.title = '入门golang开发'));