IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Проблемы с подбором по параметрам(+) (https://www.imho.ws/showthread.php?t=84111)

Sheryld 19.04.2005 13:16

Проблемы с подбором по параметрам(+)
 
У меня есть таблицы.

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 20.04.2005 13:09

а решение оказалось простым:) спасибо доброму человку, подсказал:)

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

Код:

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



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

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