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
.