1

我希望标题以某种方式有意义。

我在数据库中有 3 个表。第一个保存product_variant记录,第二个保存label记录,第三个是ref中间的表。

  • product_variant: (id, productId, serviceProviderId)。
  • label:(ID,标签)。
  • product_variant_label_ref: (label_id,variant_id)。

我的查询的输入参数是:productTypeserviceProviderId标签集,我的目标是product_variant根据输入参数选择表中的行。

这是我在休眠 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)

问题是,对于IN运算符,我得到了析取OR选择,而我想要AND介于两者之间。如果我指定不同的标签作为输入,我只想要那些product_variant通过 ref 表与所有标签有关系的行。如果输入标签之一不属于 any product_variant,则查询不应返回任何内容。谁能帮我改变我的查询?

4

1 回答 1

2

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

例如,如果您的标签参数中有 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
于 2012-09-06T09:12:58.907 回答