2017-05-31 87 views
0

我有3个表格用于存储图像,标签和两者之间的链接。该结构是这样的:Mysql WHERE 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'的行。我现在得到了这个尝试,并带回只是作为此搜索它匹配标签识别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 

这不会带来任何东西,它似乎我可能需要使用一个INNER JOIN?

+0

选择x *从X其中,n在( '一个', 'b')的基团通过具有XI计数(不同ñ )= 2 ...或类似的东西 – Strawberry

回答

1

有两个明显的解决方案。一是加入到photo_tag_bridge 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 

或者你做一个汇总匹配重复计数到所需的数匹配(这是很方便进行匹配,例如,任何2 3的标签):

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 
相关问题