Mysql SQL中的许多条件
我遇到一个SQL查询问题。。。我有3个表格图像、标签、图像标签: 图像 标签 图像标签 如您所见,第三幅图像有两个标记:Tag1和Tag2。我想创建一个查询,选择具有所有传递的标记的图像 例如,如果我给标签2,我会收到图像1和3,但是如果我添加标签1,我只会收到图像3 我尝试使用IN条件,但它返回与标记匹配的所有结果 你知道吗?多谢各位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
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)