MYSQL基于过滤器获取图像的所有常用标签

时间:2013-07-25 16:37:32

标签: mysql tags unique

我有三个表:image,tag和image_tag_link

  • 图片包含图片数据和image_id (pk)
  • 标记包含标记和tag_id (pk)
  • 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;

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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的帮助。

相关问题