Mysql递归查询

时间:2017-08-15 13:37:05

标签: mysql sql select entity-attribute-value

朋友。 Mysql DB有4个表 products,product_properties,properties,property_values

产品

|Id|name|
|1 |Book1|
|2 |Book2|
|3 |Book3|

...

属性

|Id|name|
|1 |Color|
|2 |Binding|

...

property_values

|Id|property_id|value  |
|1 |1          | red   |
|2 |1          | orange|
|3 |1          | green |
|4 |2          | soft  |
|5 |2          | hard  |

product_properties

|Id|product_id|property_id| value |
|1 |1         |1          | 1
|2 |1         |2          | 4
|3 |2         |1          | 1
|4 |2         |2          | 4
|5 |3         |1          | 2

我需要获得一个颜色为红色且结合柔和的产品列表。但我很困惑。

select products.id from products 
join product_properties on product_properties.product_id = products.id 
join properties on properties.id = product_properties.property_id
join property_values on property_values.id = product_properties.value
where properties.name = 'Color' and property_values.value = 'red'
and properties.name = 'Binding' and property_values.value = 'soft'

......没有工作......

4 个答案:

答案 0 :(得分:1)

你非常接近:

select pp.id
from product_properties pp join
     properties p
     on p.id = pp.property_id join
     property_values pv
     on pv.id = pp.value
where (p.name = 'Color' and pv.value = 'red') or
      (p.name = 'Binding' and pv.value = 'soft')
group by pp.id
having count(distinct p.name) = 2;

注意:我删除了products表,因为查询不需要它。

选择符合条件的属性。然后它选择有两个匹配的产品。

答案 1 :(得分:-1)

我会将连接写为INNER JOIN。我工作的次数最多,工作正常。

SELECT p.id
FROM products p
INNER JOIN product_properties r ON (p.id = r.property_id)
WHERE r.value ='red'

它不是你的完整查询,但我希望我能理解:-)

更多信息:https://www.w3schools.com/sql/sql_join_inner.asp

答案 2 :(得分:-1)

你的陈述很好......检查here

答案 3 :(得分:-1)

试试这个,伙计。

SELECT 
    *
FROM 
    products
WHERE
    Id IN (
            SELECT 
                DISTINCT(pdc.id) AS product_id 
            FROM 
                products pdc
                INNER JOIN product_properties pp ON (pp.product_id = pdc.Id)
                INNER JOIN properties prop ON (prop.Id = pp.property_id)
                INNER JOIN property_values ppv ON (ppv.Id = pp.value)
            WHERE
                pp.value = 1 
        ) AND
    Id IN (
            SELECT 
                DISTINCT(pdc.id) AS product_id 
            FROM 
                products pdc
                INNER JOIN product_properties pp ON (pp.product_id = pdc.Id)
                INNER JOIN properties prop ON (prop.Id = pp.property_id)
                INNER JOIN property_values ppv ON (ppv.Id = pp.value)
            WHERE
                pp.value = 4 
        )

PS。在该建模下,您不需要表product_properties上的property_id列。