2017-05-31 6 views
0

私は画像、タグ、およびこれらの間のリンクを格納するために3つのテーブルを持っています。 - 写真ここでXはYとZの両方に一致します

pid  name 
-------------- 
1  image1 
2  image2 
3  image3 
4  image4 

表 - タグ

tagID tagName 
--------------- 
1  red 
2  blue 
3  yellow 
4  green 

表 - photo_tag_bridge

pid  tagID 
------------- 
1  1 
2  1 
3  1 
1  2 
1  3 

私だけ取得するためにSELECT文を作成したい

表:構造は次のようです複数の 'tagIDに一致する' photos 'の行。私は現在、これは試してみて、それがTAGID 1及び2

SELECT photos.pid 
, photo_tag_bridge.pid, photo_tag_bridge.tagID 
, tags.tagID 
FROM photos 
, photo_tag_bridge 
, tags 
where photos.pid = photo_tag_bridge.pid 
AND photo_tag_bridge.tagID = 1 
AND photo_tag_bridge.tagID = 2 
GROUP BY photos.pid 

これは何かを持ち帰るしない一致したとしてだけでイメージ1取り戻すために持っていると、私がINNER JOINを使用する必要がありますが?

+0

セレクトX * N( 'A'、 'B')中のXIによるグループカウント(異なるNを有する。ここで、xから。 )= 2 ...またはそのようなもの – Strawberry

答えて

1

2つの明白な解決策があります。一つはphoto_tag_bridgeの2つのインスタンス(とタグあなたが実際にこの表から任意のデータを使用していた場合の2つのインスタンス)に参加することです:

SELECT photos.pid 
FROM photos 
, photo_tag_bridge ptb_a 
, photo_tag_bridge ptb_b 
WHERE photos.pid = ptb_a.pid 
AND photos.pid = ptb_b.pid 
AND ptb_a.tagID = 1 
AND ptb_b.tagID = 2 

それとも、必要な数にDISTINCTカウントが一致する集計を行いますマッチ(例えば、3つのタグの任意の2一致する便利である):

SELECT photos.pid 
FROM photos 
, photo_tag_bridge ptb 
WHERE photos.pid = ptb_a.pid 
AND photos.pid = bptb_b.pid 
AND ptb.tagID IN (1,2) 
GROUP BY photos.pid 
HAVING COUNT(DISTINCT ptb.tagID)=2; 
0

私の理解として、あなたは複数のタグを持つ写真IDを取得する必要があります。

create table #photo(id int,name varchar(10)) 
create table #phototag(pid int,tgid int) 
create table #tag(id int,name varchar(10)) 

select p.id,p.name from #photo p inner join #phototag pt on pt.pid=p.id group by p.id,p.name having count(*)>1 
関連する問題