【问题标题】:MYSQL get all common tags for images based on a filterMYSQL 根据过滤器获取图像的所有常用标签
【发布时间】:2013-07-25 16:37:32
【问题描述】:

我有三个表:image、tag 和 image_tag_link

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 你不能做HAVING COUNT(DISTINCT ) > 2 或 3 随便你..
  • 我试过了,不幸的是它给了我同样的结果。我已经尝试过使用子查询和其他各种建议来获取堆栈溢出时发现的项目和标签,但这里的问题是如何只获取所有图像共有的标签而不是更多。
  • 先获取图片数量再做HAVING COUNT( DISTINCT ) = no_of_images.怎么样?

标签: mysql tags unique


【解决方案1】:

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

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);

【讨论】:

  • 我得到一个错误:有子句中的未知列 NumImages.cnt。我尝试了聚合路由,我想我不知道该怎么做是通过交叉连接获得独特的结果。
  • 还是不高兴,这会返回与 :list_of_tag_ids 相同的标签。
  • 我想要实现的是:我有一个用户可以点击的标签列表,然后通过选择一个标签,它会禁用不允许的标签组合。用户永远不应该选择没有结果的标签。
【解决方案2】:

终于找到了与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 的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多