Jestem nowy w SQL i bazach danych. Muszę utworzyć zapytanie SQL, aby znaleźć

all posts that have tags with tagname='t1'

Relacja między postami a tagami to wiele do wielu

Stworzyłem więc schemat i kilka instrukcji wstawiania, jak poniżej:

create table Posts(
p_id int ,
p_name varchar 
);

create table Tags(
t_id int ,
t_name varchar 
);

Ponieważ relacja wiele-do-wielu wymaga tabeli sprzężeń, również ją stworzyłem

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' );

Teraz, jak mam wykonać zapytanie SQL, aby uzyskać wszystkie posty, które mają tagi z t_name='t1'? Czy można wysłać zapytanie only the two tables Posts and Tags i uzyskać poprawny wynik? A może powinienem również użyć tabeli Posts_Tags?

Wybacz, ale mam małą wiedzę na temat rdbms i SQL.

1
Damon Julian 14 sierpień 2011, 11:59

3 odpowiedzi

Najlepsza odpowiedź

Nie - potrzebujesz trzech tabel:

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';

Ten układ tabeli jest poprawnym sposobem tworzenia relacji mant-do-wielu między postami i tagami. Posts_Tags nazywa się tablicą powiązaną.

2
Bohemian 14 sierpień 2011, 12:09

Musisz połączyć tagi z post_tags, aby znaleźć identyfikatory postów o nazwie t_name równej „t1”. tj.

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

Jeśli chcesz uzyskać więcej szczegółów niż tylko identyfikator posta, musisz dołączyć do wszystkich 3 tabel, takich jak:

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'
1
Wolfwyrd 14 sierpień 2011, 12:04

Potrzebujesz trzech stołów. Oto zapytanie, którego należy użyć (nieprzetestowane):

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';
1
olivier 14 sierpień 2011, 12:05