imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Веб-мастеру > Веб-программирование
Опции темы
Старый 19.04.2005, 13:16     # 1
Sheryld
Full Member
 
Регистрация: 29.05.2002
Сообщения: 544

Sheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царстве
Проблемы с подбором по параметрам(+)

У меня есть таблицы.

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.
Sheryld вне форума  
Старый 20.04.2005, 13:09     # 2
Sheryld
Full Member
 
Регистрация: 29.05.2002
Сообщения: 544

Sheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царстве
а решение оказалось простым спасибо доброму человку, подсказал

корректный псевдозапрос:

Код:
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 ) = «количество параметров, учавствующих в подборе, в данном случае равно двум»
__________________
убрано по просьбе администратора
Sheryld вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 23:03.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.