SQL-WHERE子句中的AND条件

马布

我正在设置一个新的Photo Gallery Web应用程序,现在我在使用SQL查询时遇到了一些问题。

ERD:

我有一张桌子Photo和一张桌子PeopleTag这些表之间的关系为n:n,因此我Photo_PeopleTag为外键创建了第三个表

列:

  • 照片-> ID,文件名等
  • PeopleTag-> ID,名称
  • Photo_PeopleTag-> ID,PhotoId,PeopleTagId

Photo_PeopleTag表中的数据

+----------------------------+
| ID | PhotoId | PeopleTagId |
+----------------------------+
| 1  |    1    |       2     |
| 2  |    2    |       2     |
| 3  |    2    |       8     |
| 4  |    4    |       3     |
+----------------------------+

现在,我需要一个查询,该查询仅给我提供标记了Peoples 2 AND 8的图片。在这种情况下,它将是PhotoId 2。

在这个例子中,只有2个人。但是还会有其他图片,最多容纳2个人。

有谁知道这个查询的样子吗?

以下代码段无效-> 0个结果

SELECT * 
FROM [dbo].[Photo_PeopleTag] 
WHERE [PeopleTagId]  = '2' 
  AND [PeopleTagId]  = '8'

有了此代码段,它可以工作,但是我必须始终在其中设置一个计数值。而且我不确定这是否真的是正确的方式/代码。

SELECT PhotoId 
FROM [dbo].[Photo_PeopleTag]
WHERE PeopleTagId IN ('2', '8')
GROUP BY PhotoId
HAVING COUNT(*) = 2
蒂姆·比格莱森(Tim Biegeleisen)

您当前的查询已结束,但是您需要声明不同的人员标签数:

SELECT PhotoId
FROM [dbo].[Photo_PeopleTag]
WHERE PeopleTagId IN (2, 8)
GROUP BY PhotoId
HAVING COUNT(DISTINCT PeopleTagId) = 2;

对于仅检查两个标签的特殊情况,我更喜欢将上面的代码写为:

SELECT PhotoId
FROM [dbo].[Photo_PeopleTag]
WHERE PeopleTagId IN (2, 8)
GROUP BY PhotoId
HAVING MIN(PeopleTagId) <> MAX(PeopleTagId);

这个版本使数据库使用PeopleTagId上的索引来加快查询的可能性(尽管在SQL Server上可能不是)。当声明三个或更多标签时,我们不能使用此技巧。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章