1

我是 SQL 和数据库的新手。我需要创建一个 SQL 查询来查找

all posts that have tags with tagname='t1'

帖子和标签之间的关系是多对多的

因此,我创建了架构和一些插入语句,如下所示:

create table Posts(
p_id int ,
p_name varchar 
);

create table Tags(
t_id int ,
t_name varchar 
);

由于多对多关系需要一个连接表,我也创建了它

create table Posts_Tags(
p_id int,
t_id int 
);

insert into Posts values('1','P1' );
insert into Posts values('2','P2' );
insert into Posts values('3','P3' );

insert into Tags values ('1','t1');
insert into Tags values ('2','t2');
insert into Tags values ('3','t3');
insert into Tags values ('4','t4');
insert into Tags values ('5','t5');

insert into Posts_Tags values('1','1' );
insert into Posts_Tags values('1','2' );
insert into Posts_Tags values('2','1' );
insert into Posts_Tags values('2','3' );
insert into Posts_Tags values('3','5' );

现在,我应该如何进行 SQL 查询来获取所有带有标签的帖子t_name='t1'?是否可以查询only the two tables Posts and Tags并得到正确的结果?还是我也应该使用 Posts_Tags 表?

原谅我,但我对 rdbms 和 SQL 知之甚少。

4

3 回答 3

2

不 - 你需要三个表:

select p.*
from Posts p
join Posts_Tags pt on pt.p_id = p.p_id
join Tags t on t.t_id = pt.t_id
where t.t_name = 't1';

此表格布局是在帖子和标签之间创建多对多关系的正确方法。Posts_Tags 称为关联表。

于 2011-08-14T08:01:22.777 回答
1

您需要使用 post_tags 加入标签以查找 t_name 为“t1”的帖子的 ID。IE

SELECT 
    p_id 
FROM 
    Post_Tags INNER JOIN Tags ON Post_Tags.t_id=Tags.t_id 
WHERE 
    t_name='t1'

如果您想要的不仅仅是帖子 ID 的更多详细信息,您将需要加入所有 3 个表,例如:

SELECT 
    p.p_id, p.p_name
FROM 
    Posts p INNER JOIN Post_Tags ON p.p_id=Post_Tags.p_id
       INNER JOIN Tags ON Post_Tags.t_id=Tags.t_id 
WHERE 
    t_name='t1'
于 2011-08-14T08:04:43.320 回答
1

你需要三个表。这是您应该使用的查询(未经测试):

SELECT p_name
FROM Posts AS p
INNER JOIN Posts_Tags AS pt ON pt.p_id = p.p_id
INNER JOIN Tags AS t ON pt.t_id = t.t_id
WHERE t.t_name = 't1';
于 2011-08-14T08:05:27.420 回答