В базе данных mysql есть специальная таблица, в которой хранятся позиции заказа
+----+------------+----------+--------+------+------+------+------+
| id | product_id | order_id | source | col1 | col2 | col3 | col4 |
+----+------------+----------+--------+------+------+------+------+
| 1 | 1 | 1 | store1 | x | y | z | w |
| 2 | 2 | 1 | store1 | x | y | z | p |
| 3 | 1 | 2 | store1 | a | s | d | f |
| 4 | 1 | 2 | store2 | g | h | j | k |
+----+------------+----------+--------+------+------+------+------+
Внешний ключ заказа - order_id и source, потому что может быть один и тот же идентификатор заказа с другим источником. Эта таблица собирает товары из нескольких магазинов.
Есть также ~ 40 других полей, которые не являются ключевыми.
Существует существующий интерфейс для управления этими элементами, с множеством фильтров для полей, таких как фильтры даты, фильтр продукта, фильтр источника и еще ~ 20 и любая их комбинация.
В структуре MVC, которая обрабатывает это, я строю запрос динамически на основе фильтров и предоставляю его для модели, которая управляет извлечением элементов, подсчетом pagiantion и т. Д.
Цель состоит в том, чтобы расширить этот запрос с помощью новой опции: когда есть активный фильтр для product_id и менеджер ставит новый флажок, мне нужно выбрать не только строки с указанным product_id, но и каждую строку с тот же код заказа + источник, который содержит выбранный продукт.
Например, когда я фильтрую product_id = 2 в примере, я получаю id = 2, но с новой опцией я должен получить id = 1 и id = 2, потому что эти элементы принадлежат к одному и тому же порядку (order_id = 1 и source = ' store1 '), и этот заказ содержит product_id = 2
Конечно, следует применять и другой фильтр, например, когда фильтр количества активен, я должен также применить его.
Есть также соединения с другими таблицами, такими как продукты, штаты, страны и т. Д.
Пока у меня есть только базовый выбор с ~ 20-30 необязательными фильтрами и порядок для любого активного столбца.
SELECT *
FROM orderitems
JOIN products USING (product_id)
WHERE 1
[optional: AND product_id=1 AND quantity>2 AND country_id=123 AND created_time>"2019-01-01" etc]
ORDER BY created_time DESC
Есть идеи, как мне его расширить?