考虑下表:
当用户在网站上提供过滤器时,我收到的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')
答案 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