MySQL通过多个数据透视表查询WHERE

Boy*_*oyd 11 mysql sql

products 
+----+--------+
| id | title  |
+----+--------+
|  1 | Apple  |
|  2 | Pear   |
|  3 | Banana |
|  4 | Tomato |
+----+--------+

product_variants
+----+------------+------------+
| id | product_id | is_default |
+----+------------+------------+
|  1 |          1 |          0 |
|  2 |          1 |          1 |
|  3 |          2 |          1 |
|  4 |          3 |          1 |
|  5 |          4 |          1 |
+----+------------+------------+

properties
+----+-----------------+-----------+
| id | property_key_id |   value   |
+----+-----------------+-----------+
|  1 |               1 | Yellow    |
|  2 |               1 | Green     |
|  3 |               1 | Red       |
|  4 |               2 | Fruit     |
|  5 |               2 | Vegetable |
|  6 |               1 | Blue      |
+----+-----------------+-----------+

property_keys
+----+-------+
| id | value |
+----+-------+
|  1 | Color |
|  2 | Type  |
+----+-------+

product_has_properties
+----+------------+-------------+
| id | product_id | property_id |
+----+------------+-------------+
|  1 |          1 |           4 |
|  2 |          1 |           3 |
|  3 |          2 |           4 |
|  4 |          3 |           4 |
|  5 |          3 |           4 |
|  6 |          4 |           4 |
|  7 |          4 |           5 |
+----+------------+-------------+

product_variant_has_properties
+----+------------+-------------+
| id | variant_id | property_id |
+----+------------+-------------+
|  1 |          1 |           2 |
|  2 |          1 |           3 |
|  3 |          2 |           6 |
|  4 |          3 |           4 |
|  5 |          4 |           1 |
|  6 |          5 |           1 |
+----+------------+-------------+
Run Code Online (Sandbox Code Playgroud)

我需要查询我的数据库,以便选择products哪些properties附加到产品本身或者将这些属性附加到其中一个相关的数据库product_variants.也应该properties使用相同的properties.property_key_id进行分组,如下所示:(pkey1='red' OR pkey1='blue') AND (pkey2='fruit' OR pkey2='vegetable')

示例案例:

  • 选择所有产品(color='red' AND type='vegetable').这应该只返回番茄.
  • 选择所有产品((color='red' OR color='yellow') AND type='fruit')应该返回Apple和Banana

请注意,在上面的示例中,我不需要通过properties.value进行查询,我可以通过properties.id进行查询.

我使用MySQL查询玩了很多,但我遇到的最大问题是通过两个数据透视表加载的属性.加载它们是没有问题,但装载,并结合正确的结合WHERE,ANDOR声明是.

Chr*_*ron 9

以下代码应该为您提供所需的内容,但是您应该注意到您的表目前有一个黄色和蔬菜列表的番茄.显然你想要番茄是红色的而番茄实际上是一种水果而不是蔬菜:

Select distinct title 
from products p
inner join
product_variants pv on pv.product_id = p.id
inner join
product_variant_has_properties pvp on pvp.variant_id = pv.id
inner join
product_has_properties php on php.product_id = p.id
inner join
properties ps1 on ps1.id = pvp.property_id --Color
inner join
properties ps2 on ps2.id = php.property_id --Type
inner join
property_keys pk on pk.id = ps1.property_key_id or pk.id = ps2.property_key_id

where ps1.value = 'Red' and ps2.value = 'Vegetable'
Run Code Online (Sandbox Code Playgroud)

这是SQL小提琴:http://www.sqlfiddle.com/#!9 / 309ad/3/0