我有一个包含以下数据的表:
product_id | product_attribute_id | value
1 | 1 | red
1 | 2 | XL
1 | 3 | 300g
2 | 1 | black
2 | 2 | XXL
2 | 3 | 400g
如果我想让产品具有价值:红色,xl,300g,我该怎么办?
请大家给我建议!
答案 0 :(得分:0)
对于每个属性,一种方法是自我INNER JOIN
,但这并不适合参数化,因为如果您有不同数量的参数,则必须使用动态SQL。
你还没有说出表名是什么,所以我认为它是eav
。
SELECT
a.product_id
FROM
eav AS a
INNER JOIN eav AS b ON a.product_id = b.product_id AND b.value = 'red'
INNER JOIN eav AS c ON a.product_id = c.product_id AND c.value = 'xl'
INNER JOIN eav AS d ON a.product_id = d.product_id AND d.value = '300g'
另一种方法是获取值在所需集合中的所有行,然后GROUP BY product_id
并比较唯一COUNT
值的product_id
(来自每个匹配的value
)与预期数量(在这种情况下,3):
SELECT
product_id
FROM
eav
WHERE
value IN ( 'red', 'xl', '300g' )
GROUP BY
product_id
HAVING
COUNT( product_id ) = 3
如果这是Microsoft SQL Server,您可以在表值参数上将IN ( ... )
转换为INNER JOIN
,这样您就不需要使用动态SQL - 但是我不会这样做。知道MySQL的等价物是什么:
DECLARE @values TABLE ( value )
INSERT INTO @values ( value ) VALUES
( 'red' ), ( 'xl' ), ( '300g' ); -- this is an example, in reality this would be generated by your application/client code
SELECT
product_id
FROM
eav
INNER JOIN @values AS v ON eav.value = v.value
GROUP BY
product_id
HAVING
COUNT( product_id ) = ( SELECT COUNT(*) FROM @values )