【问题标题】:MySQL Query to find all subscriptions to a tag where all values matchMySQL Query 查找所有值匹配的标记的所有订阅
【发布时间】:2021-07-24 06:59:22
【问题描述】:

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

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

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

我尝试了很多方法,包括:

SELECT 

productID

FROM productTagSubscription

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

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

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

表结构:

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

【问题讨论】:

  • 看来您可以使用不同的计数。共享示例数据脚本和表格脚本以及预期输出。
  • 谢谢 Amit - 使用 DISTINCT COUNT 会给我什么结果?我不确定我是否理解您的解决方案。
  • 你的问题是如果一个产品订阅了所有标签(不是我提供的任何标签)。可能需要这个不同的计数。但是没有示例数据脚本和示例数据的预期输出,没有人可以提供帮助
  • 示例数据脚本?我认为这不是我发布的查询?
  • 请检查here提供的解决方案是否对您有帮助。我认为是一样的。

标签: php mysql database


【解决方案1】:

您可以为每个产品计算不同的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
);

【讨论】:

  • 感谢 Juan - 这很棒,与 Amit 提供的解决方案几乎相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多