php - MySQL Query 查找所有值匹配的标记的所有订阅
问题描述
我正在努力表达我想要实现的目标。
我有一个可以分配许多标签的产品,然后我有一个包含 productID 和 tagID 的订阅表。
我想以最有效的方式搜索订阅表,以查看产品是否订阅了所有标签(不是我提供的任何标签)。
我已经尝试了很多事情,包括:
SELECT
productID
FROM productTagSubscription
WHERE tagID IN ( 'id1', 'id2', 'id3', 'id4');
所以产品必须在订阅表中以 4 行的形式订阅所有 4 个 ID
然后,这将撤回任何 id 的任何记录,这不是我想要实现的 - 任何建议都值得赞赏!
预期 输出 当将所有 3 或 4 个 tagID 传递到表中时,我的预期输出将给我一个所有订阅所有提供的标签的产品列表。
解决方案
您可以计算tagID
每种产品的不同之处。
SELECT productID
FROM productTagSubscription
GROUP BY productID
HAVING COUNT(tagID) = 4; /* total amount of tags */
在许多数据透视表中,您可以找到唯一的对键,在这种情况下,在 (productID, tagID) 之间,如果不是这样,请确保tagID
是DISCTINCT
.
HAVING COUNT(DISCTINCT(tagID)) = 4;
只要我更改 COUNT 数字以匹配我正在寻找的标签数量
如果你想避免这个数字,假设所有标签都用在一个或另一个产品中。
HAVING COUNT(DISCTINCT(tagID)) = (
SELECT MAX(DISCTINCT(tagID))
FROM productTagSubscription
);
HAVING COUNT(DISCTINCT(tagID)) = (
SELECT COUNT(*) FROM tags
);
推荐阅读
- mysql - 上传加载本地数据
- sqlalchemy - sqlalchemy 获取最后插入的 ID|创建的记录(asyncpg 适配器)
- google-chrome-extension - 谷歌删除了我的扩展程序,试图了解原因
- nlp - Spacy nl 没有正确大写句子
- sql - RESTfull 中的 POST 方法与 sql 或使用语句生成 id 的问题?
- wpf - 如何在 DataGrid 中编辑 RowHeader?
- python - ModuleNotFoundError at / No module named 'punctuator.punc'; 'punctuator' 不是一个包 - Heroku,aws,django
- javascript - React、semantic-ui 和 apollo 的无效钩子调用错误
- oracle - 如何在 oracle 中将 varchar 转换为日期
- reactjs - React Player 字幕未显示