MySQL查询基于AND选择链接表中的项目
Posted
技术标签:
【中文标题】MySQL查询基于AND选择链接表中的项目【英文标题】:MySQL query to select items in a linked table based on AND 【发布时间】:2021-10-14 03:45:09 【问题描述】:我有一张包含照片详细信息的 tblPhotos 表格:
| photoID | photoName |
| ------- | --------- |
| 1 | w |
| 2 | x |
| 3 | y |
| 4 | z |
另外一张表tblPhotoTags标签到照片:
| photoID | tagID |
| ------- | ----- |
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 3 | 2 |
| 4 | 1 |
| 4 | 2 |
我正在尝试进行几个查询,以挑选出具有任何给定标签(AND 或 OR)的照片。在示例中,假设我正在搜索链接到 tagID 1 AND/OR 2 的照片。
OR 应该挑选出所有照片(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 查询。
【问题讨论】:
一个tagID
只能有一个值,所以tagID =1 AND tagID =2
将没有结果。要么再次链接到tblPhotoTags
,要么使用聚合函数。
【参考方案1】:
如果只需要照片的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。
【讨论】:
非常有帮助。为了简化问题,我稍微缩短了要求,所以我仍然需要内部连接,但是 IN 和 COUNT 可以完美地完成工作。谢谢。 是的 - 一切正常。再次感谢。以上是关于MySQL查询基于AND选择链接表中的项目的主要内容,如果未能解决你的问题,请参考以下文章