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选择链接表中的项目的主要内容,如果未能解决你的问题,请参考以下文章

mysql怎样查询一个表中所有数据

从大表中选择非空字段

MySQL中慢查询日志

基于链接三个表中的数据更新项目

选择项目仅在某些类别中的行

MySQL触发器:更新一张表中的记录,其中同一行中的记录匹配选择查询