За последние 24 часа нас посетили 16444 программиста и 1555 роботов. Сейчас ищут 932 программиста ...

Баян — запрос для свойств товаров.

Тема в разделе "MySQL", создана пользователем Zilog, 15 апр 2010.

  1. Zilog

    Zilog Активный пользователь

    С нами с:
    7 фев 2010
    Сообщения:
    14
    Симпатии:
    1
    В поисх ходил, но пока ничего не нашёл.
    Задача - сделать фильтр по товарам; поиск производится по нескольким (N) криетриям.

    Структура следующая:

    Каталог (К): treeID

    Товар (Т): goodID, goodTreeID,
    Свойста товаров (СТ): propID, goodID, ptypeID, propValue (TEXT)

    Типы свойств (ТС): ptypeID, ptypeTreeID, ptypeCaption, ptypeType
    Значения типов свойств (ЗТС): ptypeValueID, ptypeID, ptypeValue (ТЕХТ)

    Логика такая:
    1. для каждой ветки каталога можно задавать индивидуальный набор свойств.
    2. фильтр задумывается только для тех ТС, могут иметь несколько значений (ptypeType='select', пример — выпадающий список).

    На входе:
    1. treeID,
    2. typeID, ptypeValueID — в количистве N.

    Нюансы:
    а. Свойство товара (СТ) «незнает» id Значения типа свойта (ЗТС), и хранит только само значение.
    б. СТ знает только Тип свойства (ТС), значение которого оно хранит.

    Обращаюсь к братству кодеров да програмеров с просьбой помочь сформулировать sql запрос,
    ибо собственный мозг данную задачу самостоятельно осилить пока не может.

    Спасибо.

    upd. Вроде как рабочий код для фильтра по одному свойству:
    Код (Text):
    1. SELECT pv.*, gp.*, g.*
    2. FROM magazine_ptype_values as pv
    3. LEFT JOIN magazine_goods_prop as gp ON (pv.ptypeID = gp.ptypeID AND pv.ptypeValue = gp.propValue)
    4.  JOIN magazine_goods as g ON (gp.goodID = g.goodID)
    5. WHERE g.goodTreeID=159
    6. AND pv.ptypeID=40
    7. AND pv.ptypeValueID=38
    но как его переделать, что бы кол-во фильтров было плавающим?
     
  2. Zilog

    Zilog Активный пользователь

    С нами с:
    7 фев 2010
    Сообщения:
    14
    Симпатии:
    1
    так-с... мозг задачу вроде осилил. Вот рабочий вариант запроса:

    Код (Text):
    1. SELECT * FROM magazine_goods as g
    2. JOIN magazine_goods_prop as gp1 ON (gp1.goodID = g.goodID)
    3. JOIN magazine_ptype_values as pv1 ON (pv1.ptypeID = gp1.ptypeID AND pv1.ptypeValue = gp1.propValue AND pv1.ptypeID=30 AND pv1.ptypeValueID=29)
    4. JOIN magazine_goods_prop as gp2 ON (gp2.goodID = g.goodID)
    5. JOIN magazine_ptype_values as pv2 ON (pv2.ptypeID = gp2.ptypeID AND pv2.ptypeValue = gp2.propValue AND pv2.ptypeID=39 AND pv2.ptypeValueID=31)
    6. JOIN magazine_goods_prop as gp3 ON (gp3.goodID = g.goodID)
    7. JOIN magazine_ptype_values as pv3 ON (pv3.ptypeID = gp3.ptypeID AND pv3.ptypeValue = gp3.propValue AND pv3.ptypeID=40 AND pv3.ptypeValueID=34)
    8. WHERE g.goodTreeID=159
    это для если три критерия на входе.
     
    getIvan нравится это.