Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL中的许多条件_Mysql_Sql_Many To Many - Fatal编程技术网

Mysql SQL中的许多条件

Mysql SQL中的许多条件,mysql,sql,many-to-many,Mysql,Sql,Many To Many,我遇到一个SQL查询问题。。。我有3个表格图像、标签、图像标签: 图像 标签 图像标签 如您所见,第三幅图像有两个标记:Tag1和Tag2。我想创建一个查询,选择具有所有传递的标记的图像 例如,如果我给标签2,我会收到图像1和3,但是如果我添加标签1,我只会收到图像3 我尝试使用IN条件,但它返回与标记匹配的所有结果 你知道吗?多谢各位 SELECT DISTINCT a.* FROM Images a INNER JOIN Image_Tag b

我遇到一个SQL查询问题。。。我有3个表格图像、标签、图像标签:

图像

标签

图像标签

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

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

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

你知道吗?多谢各位

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


我想知道这个问题是不是在JW的回答之后被编辑过,甚至是在更新之后,因为他有很多代表,而使用have和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或任何其他保留字作为列名。我想这个名字是唯一的。我应该提到的是,并非所有的RDBMS都允许在HAVING中使用SELECT,即使它与主查询不相关。对于这些,您可以尝试以下方法

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)

酷,谢谢你,JW!但是我不知道有多少标签用户将发送给我。。。我可以限制标签的数量,但理想的情况是不要这样做……我不知道用户会给我发送多少标签。-为什么不参数化查询?我使用PHP=>$query=mysql\u querysprintfSELECT*从图像内部连接tag\u image ON images.id\u image=tag\u image.id\u image,其中tag\u image.id\u tag位于%s$标签;这个问题处理相同的查询结构:@PieterGeerkens这不是关系划分问题。它不需要有联接或GROUPBY子句。
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')
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
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)
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)