MySQL 根据 AND 查询链接 table 中的 select 项

MySQL query to select items in a linked table based on AND

我有 table tblPhotos 的照片详情:

| photoID | photoName |
| ------- | --------- |
| 1       | w         |
| 2       | x         |
| 3       | y         |
| 4       | z         |

和另一个 table tblPhotoTags 照片标签:

| photoID | tagID |
| ------- | ----- |
| 1       | 1     |
| 1       | 2     |
| 2       | 1     |
| 3       | 2     |
| 4       | 1     |
| 4       | 2     |

我正在尝试进行几个查询,以找出具有任何给定标签(AND 或 OR)的照片。在示例中,假设我正在搜索链接到 tagID 1 AND/OR 2.

的照片

应选出所有照片(1、2、3 和 4)。

AND应该只挑出1和4.

我有以下 OR 可以正常工作:

SELECT DISTINCT tblPhotos.photoID FROM tblPhotos 
    INNER JOIN tblPhotoTags ON tblPhotos.photoID = tblPhotoTags.photoID 
    WHERE tblPhotoTags.tagID = 1 OR tblPhotoTags.tagID = 2

但我正在努力弄清楚如何执行 AND 查询。

如果只需要照片的id,则不需要加入tblPhotos

对于第一种情况 (OR),使用 DISTINCT 和一个 WHERE 子句:

SELECT DISTINCT photoID
FROM tblPhotoTags
WHERE tagID IN (1, 2);

对于第二种情况 (AND) 使用聚合并在 HAVING 子句中设置条件:

SELECT photoID
FROM tblPhotoTags
WHERE tagID IN (1, 2)
GROUP BY photoID
HAVING COUNT(*) = 2 -- the number of tagIDs in the IN list

如果您还想要照片的名称,请加入tblPhotos:

SELECT DISTINCT p.*
FROM tblPhotos p INNER JOIN tblPhotoTags t
ON t.photoID = p.photoID
WHERE t.tagID IN (1, 2);

和:

SELECT p.photoID, p.photoName
FROM tblPhotos p INNER JOIN tblPhotoTags t
ON t.photoID = p.photoID
WHERE t.tagID IN (1, 2)
GROUP BY p.photoID, p.photoName
HAVING COUNT(*) = 2 -- the number of tagIDs in the IN list

demo.