Sherman
Mephi
Нужна помощь в реализации подбора по параметрам(+)
У меня есть таблицы.
Задача сделать подбор по параметрам.
я делаю так:
т.к. каждая позиция имеет n-параметров, значит для того чтобы выбрать позицию по условию AND для n-параметров нужно n-раз объединить саму на себя таблицу item_parameter. это решение весьма медленно, т.к. уже на 8-9 объединения запрос выполняется около секунды
может быть есть иные решения(mysql 3.23.58).
пример запроса:
пояснения:
cat_LEFT - левый ключ(структура nested sets, тут значения не имеет, т.к. это просто ограничивает категории, в которых ведется поиск).
поля в которых стоит on, это поля чекбоксы, т.е. если такой параметр присутсвуте в этйо таблице — значит галочка установлена, а если его нет, то значит параметр не поддерживается позицией. само же значение параметра не важно в данном случае.
-~{}~ 19.04.05 13:54:
p.s. чудеса происходят. только что снова прогнал тест. результат примерно: 0.01 - 0.02
p.p.s. также заменил условие «= 'on'» на «is not null».
есть конечно варианты сделать часть работы на клиенте или даже закешировать что-то, но хотелось бы одним запросом, т.к. это менее геморно
-~{}~ 20.04.05 11:56:
неужели никто не сталкивался с подобной задачей?
У меня есть таблицы.
Код:
category(catID)
item(itmID, catID)
parameter(parID, catID)
item_parameter(itmID, parID, itm_par_VALUE)
я делаю так:
т.к. каждая позиция имеет n-параметров, значит для того чтобы выбрать позицию по условию AND для n-параметров нужно n-раз объединить саму на себя таблицу item_parameter. это решение весьма медленно, т.к. уже на 8-9 объединения запрос выполняется около секунды
может быть есть иные решения(mysql 3.23.58).
пример запроса:
Код:
SELECT *
FROM item_parameter
as ip
inner join item_parameter
as ip2
on ip.itm_ID = ip2.itm_ID
inner join item_parameter
as ip3
on ip.itm_ID = ip3.itm_ID
inner join item_parameter
as ip4
on ip.itm_ID = ip4.itm_ID
inner join item_parameter
as ip5
on ip.itm_ID = ip5.itm_ID
inner join item_parameter
as ip6
on ip.itm_ID = ip6.itm_ID
inner join item_parameter
as ip7
on ip.itm_ID = ip7.itm_ID
inner join item_parameter
as ip8
on ip.itm_ID = ip8.itm_ID
inner join item_parameter
as ip9
on ip.itm_ID = ip9.itm_ID
inner join item
as i
on ip.itm_ID = i.itm_ID
inner join categories
as c
on i.cat_ID = c.cat_ID
where (
ip.par_ID = 3
and ip.itm_par_DESC > 50
)
and (
ip2.par_ID = 63
and ip2.itm_par_DESC = 'on'
)
and (
ip3.par_ID = 45
and ip3.itm_par_DESC = 'on'
)
and (
ip4.par_ID = 46
and ip4.itm_par_DESC = 'on'
)
and (
ip5.par_ID = 49
and ip5.itm_par_DESC = 'on'
)
and (
ip6.par_ID = 50
and ip6.itm_par_DESC = 'on'
)
and (
ip7.par_ID = 52
and ip7.itm_par_DESC = 'on'
)
and (
ip8.par_ID = 53
and ip8.itm_par_DESC = 'on'
)
and (
ip9.par_ID = 54
and ip9.itm_par_DESC = 'on'
)
and (
c.cat_LEFT
between 107
and 262
)
ORDER BY i.itm_ID
cat_LEFT - левый ключ(структура nested sets, тут значения не имеет, т.к. это просто ограничивает категории, в которых ведется поиск).
поля в которых стоит on, это поля чекбоксы, т.е. если такой параметр присутсвуте в этйо таблице — значит галочка установлена, а если его нет, то значит параметр не поддерживается позицией. само же значение параметра не важно в данном случае.
-~{}~ 19.04.05 13:54:
p.s. чудеса происходят. только что снова прогнал тест. результат примерно: 0.01 - 0.02
p.p.s. также заменил условие «= 'on'» на «is not null».
есть конечно варианты сделать часть работы на клиенте или даже закешировать что-то, но хотелось бы одним запросом, т.к. это менее геморно
-~{}~ 20.04.05 11:56:
неужели никто не сталкивался с подобной задачей?