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 |
+----+------------+-------------+
Мне нужно запросить мою БД, поэтому он выбирает products, у которых есть определенные properties, прикрепленные к самому продукту  ИЛИ, которые имеют те свойства, которые связаны с одним из связанных с ним product_variants. Также должен 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, я могу запросить свойства .id.
Я много играл с MySQL-запросом, но самой большой проблемой, с которой я борюсь, являются свойства, загружаемые через две сводные таблицы. Загрузка их не проблема, но их загрузка и объединение их с правильными инструкциями WHERE, AND и OR.