gpt4 book ai didi

mysql - 多对多只选择具有完全相同标签的行

转载 作者:行者123 更新时间:2023-11-30 21:37:17 27 4
gpt4 key购买 nike

我有 3 个表:标签、产品和它们之间的关系表。关系表看起来像这样的例子:

tagId | ProductId
1 | 1
2 | 1
2 | 9

用户可以选择“所有这些”或“其中一个”两个选项。

因此,如果用户选择所有这些,则意味着该产品必须具有用户选择的所有标签。

因此,如果用户选择 ID 为 12 的标签,它应该只选择 ID 为 1 的产品,因为该产品 具有与用户选择的完全相同的标签。 (另一种方法是,如果用户选择 ID 为 2 的标签,它应该只选择 ID 为 9 的产品。)

因此,产品必须具有用户选择的所有标签(不多也不少)。

我已经拥有的用于其中任何一个的 SQL:

SELECT DISTINCT s.SKU 
FROM SKUToEAN as s
LEFT JOIN ProductDetails as p ON s.ProductDetailID=p.id
JOIN ProductTagRelation as ptr ON (ptr.productId=p.id and ptr.tagId IN(Ids of selected tags))

示例行为:

TagId = 1 it should select => None
TagId = 2 it should select => 9
TagId = 1,2 it should select = 1,9

所以我可能需要两个查询。一个用于其中任何一个(我已经有了这个),第二个用于所有这些。使用 PHP,我决定使用哪个查询。

最佳答案

您可以在ProductIDGROUP BY 并在Having 子句中使用基于条件聚合的过滤。在数字上下文中使用时,MySQL 会自动将 bool 值转换为 0/1。因此,为了针对 ProductID 提供特定的 tagID 值,它的 SUM(tagId = ..) 应该是 1 .

所有这些:

SELECT ptr.productId, s.SKU 
FROM SKUToEAN AS s
LEFT JOIN ProductDetails AS p
ON p.id = s.ProductDetailID
JOIN ProductTagRelation AS ptr
ON ptr.productId = p.id
GROUP BY ptr.productId, s.SKU
HAVING SUM(ptr.tagID = 1) AND -- 1 should be there
SUM(ptr.tagID = 2) AND -- 2 should be there
NOT SUM(ptr.tagID NOT IN (1,2)) -- other than 1,2 should not be there

关于mysql - 多对多只选择具有完全相同标签的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53326477/

27 4 0