我正在设置一个新的Photo Gallery Web应用程序,现在我在使用SQL查询时遇到了一些问题。
ERD:
我有一张桌子Photo
和一张桌子PeopleTag
。这些表之间的关系为n:n,因此我Photo_PeopleTag
为外键创建了第三个表。
列:
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
您当前的查询已结束,但是您需要声明不同的人员标签数:
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] 删除。
我来说两句