【问题标题】:Mysql WHERE X matches both Y AND ZMysql WHERE X 同时匹配 Y 和 Z
【发布时间】:2017-05-31 19:59:22
【问题描述】:

我有 3 个表用于存储图像、标签和两者之间的链接。结构是这样的:

表格 - 照片

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 语句以仅从“照片”中检索与多个“标签 ID”匹配的行。我目前正在尝试将 image1 带回来,因为它与 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?

【问题讨论】:

  • select x.* from x where n in ('a','b') group by x.i with count (distinct n) =2... 或类似的东西

标签: mysql select join tags


【解决方案1】:

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

或者您将 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;

【讨论】:

    【解决方案2】:

    据我了解,您需要获取具有多个标签的照片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
    

    【讨论】:

      猜你喜欢
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 2012-10-07
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 2014-04-05
      相关资源
      最近更新 更多