За последние 24 часа нас посетили 22047 программистов и 1126 роботов. Сейчас ищут 769 программистов ...

Фильтр товаров по нескольким свойствам из одной таблицы

Тема в разделе "MySQL", создана пользователем voii, 19 мар 2019.

  1. voii

    voii Новичок

    С нами с:
    30 июл 2018
    Сообщения:
    9
    Симпатии:
    3
    Привет! Ребята помогите оптимизировать запрос.
    Есть таблица продуктов (product), таблица свойств (product_property), таблица значений свойств (product _property_value), все эти таблицы объединяет таблица propduct_property_matching.
    Схема:
    [​IMG]
    Необходимо по свойствам из таблицы product_property_value отфильтровать все товары с имеющимся набором свойств. Если такого набора свойств нет, то и товаров нет.
    Например ищем по Коллекция = лето, модель = бейсболка, цвет = белый.
    Пока дошел только до такого запроса, но ужасно медленно работает:
    Код (Text):
    1.  
    2. SELECT
    3. product.*
    4. FROM product
    5.     LEFT JOIN product_category_matching ON product.id = product_category_matching.id_product
    6.     LEFT JOIN product_category ON product_category_matching.id_category = product_category.id
    7.    
    8. LEFT JOIN product_property_matching ppm_collection ON product.id = ppm_collection.id_product
    9.     LEFT JOIN product_property pp_collection ON ppm_collection.id_property = pp_collection.id
    10.     LEFT JOIN product_property_value ppv_collection ON ppm_collection.id_property_value = ppv_collection.id
    11.    
    12.     LEFT JOIN product_property_matching ppm_model ON product.id = ppm_model.id_product
    13.     LEFT JOIN product_property pp_model ON ppm_model.id_property = pp_model.id
    14.     LEFT JOIN product_property_value ppv_model ON ppm_model.id_property_value = ppv_model.id
    15.    
    16.     LEFT JOIN product_property_matching ppm_color ON product.id = ppm_color.id_product
    17.     LEFT JOIN product_property pp_color ON ppm_color.id_property = pp_color.id
    18.     LEFT JOIN product_property_value ppv_color ON ppm_color.id_property_value = ppv_color.id
    19.    
    20. WHERE (product_category.id=3) AND (ppv_collection.value='Лето') AND (ppv_model.value='Бейсболка') AND (ppv_color.value='Белый')
    Помогите!
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    оверкомпликейтед оверинжиниринг.
    Три таблица на хранение свойств это перебор.

    Есть два подхода
    1. Много полей в одной таблице товаров . Пусть не все они используются для каждого вида, неважно. Нуллабл.
    Запрос состоит просто из нескольких условий через and. Без джойнов.

    2. Entity-Atribute-Value. Есть товары и есть их свойства (name, value, prod_id). Отношение один ко многим.
    Для описания "шаблонов свойств" может быть дополнительно что-то. Но эти описатели не нужны в запросах, которые ты сейчас пытаешься составить.
    Запрос содержит по одному джойну на условие.
     
  3. voii

    voii Новичок

    С нами с:
    30 июл 2018
    Сообщения:
    9
    Симпатии:
    3
    Спасибо. Я предполагал что бд переделывать. Такая схема была обусловлена выгрузкой товаров из 1с. И уж очень хорошо файлы 1c.xml парсились в неё... Буду переделывать схему.
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Примеры запросов с EAV https://looker.com/blog/sql-processing-and-data-analysis-with-the-eav-model
    --- Добавлено ---
    ПМСМ, эта "гибкость" очень дорого стоит. Если есть возможность уклониться от неё и использовать просто кучу полей в product, это будет более выигрышным решением по всем показателям: по понятности запросов, скорости и эффективности использования "настоящих" типов данных.
     
  5. voii

    voii Новичок

    С нами с:
    30 июл 2018
    Сообщения:
    9
    Симпатии:
    3
    Большое спасибо!
    Вообщем то товары в таблице у меня все однотипные и у всех есть 12 свойств, которые будут относительно стабильны. Единственное не хотелось добавлять 12 справочников и 12 полей в таблицу товаров с id-ми значений свойств из справочников. Думал что это криво как-то будет (не профессионально :) ).
     
  6. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Не, не всовывать 12 полей справочников, а 12 полей каждого товара с разными свойствами.
     
  7. voii

    voii Новичок

    С нами с:
    30 июл 2018
    Сообщения:
    9
    Симпатии:
    3
    Т.е. прямо
    Код (Text):
    1.  
    2. название    |    цвет   |   модель
    3. ------------------------------------------------------
    4. название1  |   цвет1  |   модель1
    5. название2  |   цвет2  |   модель1
    ?
     
    keren нравится это.