Привет! Ребята помогите оптимизировать запрос. Есть таблица продуктов (product), таблица свойств (product_property), таблица значений свойств (product _property_value), все эти таблицы объединяет таблица propduct_property_matching. Схема: Необходимо по свойствам из таблицы product_property_value отфильтровать все товары с имеющимся набором свойств. Если такого набора свойств нет, то и товаров нет. Например ищем по Коллекция = лето, модель = бейсболка, цвет = белый. Пока дошел только до такого запроса, но ужасно медленно работает: Код (Text): SELECT product.* FROM product LEFT JOIN product_category_matching ON product.id = product_category_matching.id_product LEFT JOIN product_category ON product_category_matching.id_category = product_category.id LEFT JOIN product_property_matching ppm_collection ON product.id = ppm_collection.id_product LEFT JOIN product_property pp_collection ON ppm_collection.id_property = pp_collection.id LEFT JOIN product_property_value ppv_collection ON ppm_collection.id_property_value = ppv_collection.id LEFT JOIN product_property_matching ppm_model ON product.id = ppm_model.id_product LEFT JOIN product_property pp_model ON ppm_model.id_property = pp_model.id LEFT JOIN product_property_value ppv_model ON ppm_model.id_property_value = ppv_model.id LEFT JOIN product_property_matching ppm_color ON product.id = ppm_color.id_product LEFT JOIN product_property pp_color ON ppm_color.id_property = pp_color.id LEFT JOIN product_property_value ppv_color ON ppm_color.id_property_value = ppv_color.id WHERE (product_category.id=3) AND (ppv_collection.value='Лето') AND (ppv_model.value='Бейсболка') AND (ppv_color.value='Белый') Помогите!
оверкомпликейтед оверинжиниринг. Три таблица на хранение свойств это перебор. Есть два подхода 1. Много полей в одной таблице товаров . Пусть не все они используются для каждого вида, неважно. Нуллабл. Запрос состоит просто из нескольких условий через and. Без джойнов. 2. Entity-Atribute-Value. Есть товары и есть их свойства (name, value, prod_id). Отношение один ко многим. Для описания "шаблонов свойств" может быть дополнительно что-то. Но эти описатели не нужны в запросах, которые ты сейчас пытаешься составить. Запрос содержит по одному джойну на условие.
Спасибо. Я предполагал что бд переделывать. Такая схема была обусловлена выгрузкой товаров из 1с. И уж очень хорошо файлы 1c.xml парсились в неё... Буду переделывать схему.
Примеры запросов с EAV https://looker.com/blog/sql-processing-and-data-analysis-with-the-eav-model --- Добавлено --- ПМСМ, эта "гибкость" очень дорого стоит. Если есть возможность уклониться от неё и использовать просто кучу полей в product, это будет более выигрышным решением по всем показателям: по понятности запросов, скорости и эффективности использования "настоящих" типов данных.
Большое спасибо! Вообщем то товары в таблице у меня все однотипные и у всех есть 12 свойств, которые будут относительно стабильны. Единственное не хотелось добавлять 12 справочников и 12 полей в таблицу товаров с id-ми значений свойств из справочников. Думал что это криво как-то будет (не профессионально ).
Т.е. прямо Код (Text): название | цвет | модель ------------------------------------------------------ название1 | цвет1 | модель1 название2 | цвет2 | модель1 ?