Mysql:如何在很多条件下获得价值

时间:2017-10-19 01:57:16

标签: mysql

我有一个包含以下数据的表:

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,我该怎么办?

请大家给我建议!

1 个答案:

答案 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 )