| imho.ws |
![]() |
|
|
|
# 1 |
|
Full Member
Регистрация: 29.05.2002
Сообщения: 544
![]() ![]() ![]() ![]() ![]() |
Проблемы с подбором по параметрам(+)
У меня есть таблицы.
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, это поля чекбоксы, т.е. если такой параметр присутсвуте в этйо таблице — значит галочка установлена, а если его нет, то значит параметр не поддерживается позицией. само же значение параметра не важно в данном случае. p.s. чудеса происходят. только что снова прогнал тест. результат примерно: 0.01 - 0.02 ![]() p.p.s. также заменил условие «= 'on'» на «is not null». есть конечно варианты сделать часть работы на клиенте или даже закешировать что-то, но хотелось бы одним запросом, т.к. это менее геморно
__________________
убрано по просьбе администратора
Последний раз редактировалось Sheryld; 19.04.2005 в 13:29. |
|
|
|
|
# 2 |
|
Full Member
Регистрация: 29.05.2002
Сообщения: 544
![]() ![]() ![]() ![]() ![]() |
а решение оказалось простым
спасибо доброму человку, подсказал![]() корректный псевдозапрос: Код:
SELECT * FROM item_parameter as ip0 inner join item as i on ip0.itm_ID = i.itm_ID inner join categories as c on i.cat_ID = c.cat_ID where ( ip0.par_ID = «идентификатор параметра» and «условие проверки, может быть: is not null, in(..) и что угодно» ) or ( ip0.par_ID = «идентификатор параметра» and «условие проверки, может быть: is not null, in(..) и что угодно» ) and ( c.cat_LEFT between 107 and 262 ) GROUP BY ( i.itm_ID ) HAVING count( ip0.par_ID ) = «количество параметров, учавствующих в подборе, в данном случае равно двум»
__________________
убрано по просьбе администратора
|
|
|