0

我遇到了 SQL 查询问题...我有 3 个表(图像、标签、Image_Tag):

图片

Image_ID  |  Image_Path
1            img1.png
2            img2.png
3            img3.png

标签

Tag_ID    |  Name
1            Tag 1
2            Tag 2
3            Tag 3

Image_Tag

Image_ID  |  Tag_ID
1            2
2            3
3            1
3            2

如您所见,第三张图片有两个标签:Tag1 和 Tag2。我想创建一个查询来选择具有所有传递标签的图像。

例如,如果我给标签 2,我会收到图像 #1 和 #3,但如果我添加标签 1,我只会收到图像 #3。

我尝试使用IN条件,但它返回了与标签匹配的所有结果。

你有什么想法吗?谢谢你。

4

2 回答 2

1
SELECT  DISTINCT a.*
FROM    Images a
        INNER JOIN Image_Tag b
            ON a.Image_ID = b.Image_ID
        INNER JOIN Tags c
            ON b.Tag_ID = c.Tag_ID
WHERE   c.Name IN ('Tag2')

要进一步了解有关联接的更多信息,请访问以下链接:

更新 1

SELECT  a.*
FROM    Images a
        INNER JOIN Image_Tag b
            ON a.Image_ID = b.Image_ID
        INNER JOIN Tags c
            ON b.Tag_ID = c.Tag_ID
WHERE   c.Name IN ('Tag1','Tag2')
GROUP   BY a.Image_ID, a.Image_Path
HAVING  COUNT(*) = 2
于 2013-03-03T05:24:04.280 回答
0

我想知道这个问题是否在 JW 的回答甚至更新之后得到了编辑,因为他有很多代表和使用这个问题的答案HAVING并且COUNT是非常标准的。我从他的回答开始。此版本适用于任意数量的标签,您希望所有标签都与图像匹配。

SELECT  a.Image_ID, a.Image_Path
FROM    Images a
    INNER JOIN Image_Tag b
        ON a.Image_ID = b.Image_ID
    INNER JOIN Tags c
        ON b.Tag_ID = c.Tag_ID
GROUP BY a.Image_ID, a.Image_Path
HAVING   COUNT(*) = (SELECT COUNT(*) FROM Tags)

我不鼓励您使用Name或任何其他 SQL 保留字作为列名。我认为它Name是独一无二的。我应该提一下,并非所有 RDBMS 都允许SELECTin HAVING,即使它与主查询不相关。对于那些,你可以尝试类似

SELECT  a.Image_ID, a.Image_Path, c.Tag_ID
FROM    Images a
    INNER JOIN Image_Tag b
        ON a.Image_ID = b.Image_ID
    LEFT JOIN Tags c     -- Note change to an OUTER JOIN!
        ON b.Tag_ID = c.Tag_ID
GROUP BY a.Image_ID, a.Image_Path
HAVING   COUNT(*) = COUNT(c.Tag_ID)
于 2013-03-04T08:00:00.677 回答