2

我有三个表:image、tag 和 image_tag_link

  • image 包含图像数据和image_id (pk)
  • tag 包含标签和tag_id (pk)
  • i用和mage_tag_link加入两者。image_idtag_id (fk)

我想获取给定标签 ID 列表的所有相关标签。例如,如果我有三个共享两个标签的图像,除其他外,我只想检索给定过滤器的这两个标签(它们都有共同的标签)。

我目前正在使用(简化为仅使用链接表):

select itl1.tag_id
from image_tag_link itl1 
inner join image_tag_link itl2 on itl2.image_id = itl1.image_id
where itl2.tag_id in (:list_of_tag_ids)
group by itl1.tag_id;

但是,这为我提供了所有符合过滤条件的图像的所有标签。

任何帮助将不胜感激。

4

2 回答 2

0

您可以使用聚合来做到这一点。这个想法是获取与过滤器匹配的所有图像。然后重新加入以获取这些图像上的所有标签。以下以计数的降序返回标签:

select itl.tag_id, count(*) as numtags
from image_tag_link itl join
     (select distinct image_id
      from image_tag_link 
      where tag_id in (:list_of_tag_ids)
     ) i
     on itl.image_id = i.image_id
group by itl.tag_id
order by numtags desc;

以下更进一步,仅返回所有图像上的图像:

select itl.tag_id, count(*) as numtags
from image_tag_link itl join
     (select distinct image_id
      from image_tag_link 
      where tag_id in (:list_of_tag_ids)
     ) i
     on itl.image_id = i.image_id cross join
     (select count(distinct image_id) as cnt
      from image_tag_link 
      where tag_id in (:list_of_tag_ids)
     ) NumImages
group by itl.tag_id
having numtags = max(NumImages.cnt);
于 2013-07-25T17:35:41.660 回答
0

终于找到了与 Manu 的答案相关的解决方案,确实是您需要的,HAVING COUNT(DISTINCT ) > no_of_tags但我的问题与图像和标签的分组有关,因此最终结果是:

select itl1.tag_id
from image_tag_link itl1
inner join image_tag_link itl2 on itl2.image_id = itl1.image_id
where itl2.tag_id in (:list_of_tags)
group by itl1.tag_id, itl1.image_id
having count(distinct itl2.tag_id) = no_of_tags;

感谢 Manu 和 Gordon 的帮助。

于 2013-08-02T14:28:21.020 回答