2011-08-14 9 views
1

からデータを取得するために正しいSQLクエリを作成するには、私は、SQLへの初心者ですとdatabases..Iが柱とタグの間どのように2つのテーブル

all posts that have tags with tagname='t1' 

関係を見つけるために、SQLクエリを作成する必要があることは、多くの-にありますだから、-many

多対多の関係が結合テーブルを必要とするので、私は

create table Posts(
p_id int , 
p_name varchar 
); 

create table Tags(
t_id int , 
t_name varchar 
); 

以下のようにスキーマおよびいくつかのINSERT文を作成し、私はそれだけでなく

を作成
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'); 

ここで、タグを持つすべての投稿をt_name='t1'で取得するにはどうすればよいですか? only the two tables Posts and Tagsを照会して正しい結果を得ることはできますか?また、Posts_Tagsテーブルも使用する必要がありますか?

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

このテーブルレイアウトがMANTを作成するための正しい方法です:あなたは3つのテーブルを必要とする -

することはありません

答えて

2

私を許して、私は少しRDBMSの知識とSQL

デイモンを持っています投稿とタグとの多対多の関係。 Posts_Tagsはassociativeテーブルと呼ばれます。

1

"t1"のt_nameを持つ投稿のIDを見つけるには、post_tagsとタグを結合する必要があります。すなわち

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

あなたが好きすべての3つのテーブルに参加する必要がありますちょうどポストIDよりも詳細場合:

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

あなたは3つのテーブルを必要とします。使用する必要のあるクエリ(テストされていない):

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'; 
関連する問題