Mysql 如何将逻辑析取查询或SQL查询更改为合取查询并匹配列表中的所有输入参数?

Mysql 如何将逻辑析取查询或SQL查询更改为合取查询并匹配列表中的所有输入参数?,mysql,sql,Mysql,Sql,我希望这个标题有点道理 我在DB里有三张桌子。第一个保存产品变量记录,第二个保存标签记录,第三个保存中间的表 产品变量:(id、productId、serviceProviderId) 标签:(id,标签) 产品变体标签参考:(标签标识,变体标识) 我的查询的输入参数是:productType、serviceProviderId和标签集和 我的目标是根据输入参数选择product\u variant表中的行 这是我在hibernate xml文件中的查询: SELECT v.* FROM

我希望这个标题有点道理

我在DB里有三张桌子。第一个保存产品变量记录,第二个保存标签记录,第三个保存中间的表

  • 产品变量
    :(id、productId、serviceProviderId)
  • 标签
    :(id,标签)
  • 产品变体标签参考
    :(标签标识,变体标识)
我的查询的输入参数是:
productType
serviceProviderId
和标签集和 我的目标是根据输入参数选择
product\u variant
表中的行

这是我在hibernate xml文件中的查询:

 SELECT v.*
 FROM product_variant v
     INNER JOIN product_variant_label_ref r ON v.id = r.variant_id
     INNER JOIN product_product p ON p.productType = :productType
     INNER JOIN product_label l ON l.id = r.label_id
     WHERE v.product_id = p.id
        AND v.serviceprovider_id = :serviceProviderId
        AND l.label in (:labels)

问题是,使用操作符中的
,我得到了析取的
选择,我希望
介于两者之间。如果我指定不同的标签作为输入,我只需要那些通过ref table与所有标签相关的
product\u variant
行。如果其中一个输入标签不属于任何
产品变量
,则查询不应返回任何内容。有人能帮我改变我的疑问吗

您需要计算每个产品返回的行数,并将其与labels参数中的项目数相匹配

例如,如果在labels参数中有3个标签

 SELECT v.id
 FROM product_variant v 
     INNER JOIN product_variant_label_ref r ON v.id = r.variant_id 
     INNER JOIN product_product p ON p.productType = :productType 
     INNER JOIN product_label l ON l.id = r.label_id 
     WHERE v.product_id = p.id 
        AND v.serviceprovider_id = :serviceProviderId 
        AND l.label in (:labels) 
 GROUP BY v.id
 HAVING COUNT(DISTINCT l.id) = 3 -- ie: Length of labels