【问题标题】:SQL Many To Many Select With Link TableSQL多对多选择与链接表
【发布时间】:2012-05-25 20:55:47
【问题描述】:

我正在尝试使用以下 3 个表格使我的关键字搜索尽可能高效:

tblImageFiles [ID, 图片网址]

tblTags [ID,标签]

tblxImagesTags [ID, ImageID, TagID](这是一个多对多关系的链接表)

任何人都可以帮助我使用存储过程返回与基于此架构输入的所有搜索标签匹配的所有图像吗?

谢谢

【问题讨论】:

标签: sql search stored-procedures many-to-many sql-match-all


【解决方案1】:

count(distinct aux.TagID) 中的数字必须等于where t.Tag in (tag1, tag2, tag3) 中的标签数。

select img.* from tblImageFiles img
inner join (
   select it.ImageID from tblTags t
   inner join tblxImagesTags it on it.TagID = t.ID
   where t.Tag in (tag1, tag2, tag3)
   group by it.ImageID
   having count(distinct it.TagID) = 3
) aux on aux.ImageID = img.ID

【讨论】:

  • 谢谢,但是当我运行查询时收到以下消息:SELECT 子句中的错误:'IF' 附近的表达式有什么想法吗?
  • @Mike 是的,我更正了。我使用 if 作为别名,但它是保留键。我修改了代码,让它按照你想要的方式放置。
  • 啊,这可行,但与 Matts 建议的问题相同,它返回与任何标签匹配的图像而不是过滤,关于如何实现这一点的任何建议?
  • @Mike 你用过group by 查询吗?再试一次。如果您放置更多标签,则需要将3替换为标签总数。
  • 很抱歉,直到我发布回复后我才刷新页面:/ 如果我粘贴您的查询,我会收到此错误:“多部分标识符“aux.ImageID”不能是绑定..不确定是什么原因造成的..!
【解决方案2】:
        SELECT tblImageFiles.ImageURL
          FROM tblImageFiles
  WHERE EXISTS (SELECT 1
                  FROM tblxImagesTags
            INNER JOIN tblTags
                    ON tblTags.ID = tblxImagesTags.TagID
                 WHERE tblxImagesTags.ImgageID = tblImageFiles.ID
                   AND tblTags.Tag = <searchtag1>)
    AND EXISTS (SELECT 1
                  FROM tblxImagesTags
            INNER JOIN tblTags
                    ON tblTags.ID = tblxImagesTags.TagID
                 WHERE tblxImagesTags.ImgageID = tblImageFiles.ID
                   AND tblTags.Tag = <searchtag2>)
                // etc...

派生表可以分离出来,但其语法取决于您使用的数据库。您还需要运行一个循环以确保您可以处理可变数量的搜索词,但这是基本思想。

【讨论】:

  • 谢谢,这似乎很接近,但返回匹配任何标签的图像,如果可能,我需要它来匹配所有标签,例如,搜索“门”应该产生比“红色,门”更多的结果' 因为它应该过滤
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 2010-12-31
  • 2023-04-09
相关资源
最近更新 更多