首页 > 解决方案 > MySQL Query 查找所有值匹配的标记的所有订阅

问题描述

我正在努力表达我想要实现的目标。

我有一个可以分配许多标签的产品,然后我有一个包含 productID 和 tagID 的订阅表。

我想以最有效的方式搜索订阅表,以查看产品是否订阅了所有标签(不是我提供的任何标签)。

我已经尝试了很多事情,包括:

SELECT 

productID

FROM productTagSubscription

WHERE tagID IN ( 'id1', 'id2', 'id3', 'id4');

所以产品必须在订阅表中以 4 行的形式订阅所有 4 个 ID

然后,这将撤回任何 id 的任何记录,这不是我想要实现的 - 任何建议都值得赞赏!

表结构: 在此处输入图像描述

预期 输出 当将所有 3 或 4 个 tagID 传递到表中时,我的预期输出将给我一个所有订阅所有提供的标签的产品列表。

标签: phpmysqldatabase

解决方案


您可以计算tagID每种产品的不同之处。

SELECT productID
FROM productTagSubscription
GROUP BY productID
HAVING COUNT(tagID) = 4; /* total amount of tags */

在许多数据透视表中,您可以找到唯一的对键,在这种情况下,在 (productID, tagID) 之间,如果不是这样,请确保tagIDDISCTINCT.

HAVING COUNT(DISCTINCT(tagID)) = 4;

只要我更改 COUNT 数字以匹配我正在寻找的标签数量

如果你想避免这个数字,假设所有标签都用在一个或另一个产品中。

HAVING COUNT(DISCTINCT(tagID)) = (
    SELECT MAX(DISCTINCT(tagID))
    FROM productTagSubscription 
);

HAVING COUNT(DISCTINCT(tagID)) = (
    SELECT COUNT(*) FROM tags
);

推荐阅读