我是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知之甚少。
答案 0 :(得分: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称为associative表。
答案 1 :(得分:1)
您需要使用post_tags连接标签,以找到t_name为“t1”的帖子的ID。即。
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'
答案 2 :(得分: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';