对相同列的严格限制不能按预期工作

时间:2017-02-19 09:27:47

标签: mysql sql

考虑下表:

enter image description here

当用户在网站上提供过滤器时,我收到的group_id集合中包含相应的value_id参数。 例如,集合的输入可能如下所示:

Array(
    '4' => '7',
    '2' => '4'
)

所以,我试图通过收到的约束来选择行,并且匹配必须严格遵守这些约束,这就是问题所在。 我尝试过的任何东西都没有按预期工作。

这是第一个应该起作用的显而易见的事情(因为表中有确切的匹配),但它没有:

SELECT * FROM product_attributes WHERE

    (group_id = '4' AND value_id = '7') 
        AND 
    (group_id = '2' AND value_id = '4')

然后我尝试使用IN运算符进行选择,该运算符有效,但由于其内部基于OR运算符,所以并不是非常严格。 例如,此查询(注意我将2替换为13)必须不返回任何内容,因为没有匹配13 = 7(group_id = value)

SELECT * FROM bono_module_shop_product_attributes WHERE

(group_id IN ('4', '13') AND value_id IN ('6', '7'))

但它会返回一行。

所以我的问题是,就SQL逻辑而言,如何使这个查询起作用:

SELECT * FROM product_attributes WHERE

    (group_id = '4' AND value_id = '7') 
        AND 
    (group_id = '2' AND value_id = '4')

2 个答案:

答案 0 :(得分:1)

我认为我们需要使用condtional聚合来检查两个记录是否存在。然后,使用WHERE条件检查是否存在 记录,以及两者一起出现的要求。

SELECT *
FROM product_attributes
WHERE ((group_id = '4' AND value_id = '7') OR
      (group_id = '2' AND value_id = '4')) AND
      (SELECT SUM(CASE WHEN (group_id = '4' AND value_id = '7') OR
                            (group_id = '2' AND value_id = '4')
                       THEN 1 ELSE 0 END)
       FROM product_attributes) = 2

答案 1 :(得分:0)

我猜你真正想要的是product_id,而不是单个匹配的行。

然后,您需要匹配product_attributes表格的多行,每一行都与您的group_id, value_id选项之一匹配,并且所有这些都匹配相同的产品。

SELECT pa1.product_id
    FROM product_attributes pa1
    JOIN product_attributes pa2 ON pa1.product_id = pa2.product_id
    WHERE pa1.group_id = 4 AND pa1.value_id = 7
    AND pa2.group_id = 2 AND pa2.value_id = 4

另一种选择是使用GROUP BY

SELECT product_id
    FROM product_attributes
    WHERE (group_id = 4 AND value_id = 7)
    OR (group_id = 2 AND value_id = 4)
    GROUP BY product_id
    HAVING count(*) = 2