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.
我有 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.