Помогите с запросами для фильтра

BreeZ

Новичок
Помогите с запросами для фильтра

Приветствую,

Необходимо составить БЫСТРЫЙ запрос для фильтра. Юзер выбирает определённые значения у определённых параметров и ему должны выдаться товары у которых эти вот параметры равны соответствующим значениям.

Есть у меня таблица tovar_atrib с такой структурой:
tovar_id int(11)
atrib_id int(11)
value_id int(11)

Мне нужно получить такие tovar_id у которых несколько атрибутов имеют определённые значения, то есть предположим мне нужен товар у которого атрибут 1 имеет значение 10, атрибут 2 имеет значение 5, атрибут 4 имеет значение 20. То есть должен быть запрос который извлечёт такие товары у которых есть записи такого вида:
tovar_id | atrib_id | value_id
id товара | 1 | 10
id товара | 2 | 5
id товара | 4 | 20

Надеюсь понятно объяснил

Пытался сделать через INNER JOIN таким способом
SELECT DISTINCT t1.tovar_id from tovar_atrib t1 INNER JOIN tovar_atrib t2 ON (t1.tovar_id = t2.tovar_id AND t2.atrib_id = 1 AND t2.value_id = 10) INNER JOIN tovar_atrib t3 ON (t1.tovar_id = t3.tovar_id AND t3.atrib_id = 2 AND t3.value_id = 5) INNER JOIN tovar_atrib t4 ON (t1.tovar_id = t4.tovar_id AND t4.atrib_id = 4 AND t4.value_id = 20)

Пытался также и вот так
SELECT DISTINCT t1.tovar_id from tovar_atrib t1 where t1.id IN (SELECT tovar_id from tovar_atrib where atrib_id = 1 AND value_id = 10)....

Дело усложняется ещё и тем, что на странице с фильтром рядом с каждым значением должен быть подсчёт товаров, у которых этот параметр равен этому значению... Ну, в общем, вот сайт http://shoprate.ru/cat18.html. Американские аналоги это http://shopzilla.com, http://shopping.yahoo.com и т.д.

Получается время генерации страницы чуть ли не две секунды :(
Может надо менять структуру базы?
 

Барби

Новичок
была у меня такая задача... решал не скажу что красиво, но для базы с около 1000 товаров и с десяток атрибутов работало довольно таки сносно.
смысл сводил к тому что сделать столько запросов, сколько атрибутов нам надо сравнить. в твоём конкретном приведёном примере 3 запроса... для каждого атрибута по запросу. получив результат циклом заполняешь масив что нить вроде:
$match[$row['tovar_id']]++;
и в конце пробегаешь по масиву и смотришь у кого значения будет равно количетву атрибутов (в твоём примере 3)
 
Сверху