[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Фильтр товаров по характеристикам
b1f
Добрый день, обращаюсь к вам за помощью.
Вопрос из заголовка, требуется отфильтровать товары по их характеристикам. Покажу пример базы, и как пробовал получить данные ниже.

Поиск нужно провести одновременно по двум таблицам и выбрать походящие объявления.

Таблица ad - объявления (вместо товаров)

#---------------------------------------------------------------------------------------
# id | name | .... | price | country_id | region_id | ...
#---------------------------------------------------------------------------------------
1 Название1 ... 60000 2 22
2 Название2 ... 120000 2 22



В этой таблице поиск может идти по полям такие как: Название, цена, страна, город ....


Таблица ad_ad_modified - характеристики объявлений (к примеру: категория объявлений "Компьютерные мыши", у них характеристики есть следующие: Кол-во кнопок, бренд, цвет, подключение (проводное/беспроводное) .... )

Вот так выглядит таблица, которая хранит эти характеристики (Названия и значния хранятся в другой таблице, они нам не нужны для этой задачи)

#---------------------------------------------------------------------------
# id | ad_id | category_id | modify_id | value
#---------------------------------------------------------------------------
1 1 2 1 Microsoft
2 1 2 2 4
3 1 2 7 2шт. / AA
1 3 2 1 Logitec
2 3 2 2 2



Фильтр - обычная форма с полями при отправки ее, получаем GET строку примерно такого вида где в ключах "modified" установлен ID характеристики - modify_id, со значением для соответствия:
search?category_id=2&modified[1]=Microsoft&modified[2]=2


Сразу предупрежу, что с JOIN'ами почти никогда не работал, опыта нет.
Пробовал выбирать объявления так:

SELECT `ad`.`id`, `ad`.`shop_id`, `ad`.`shop_status`, `ad`.`name`, `ad`.`price`,`ad`.`description`, `ad`.`url`, `ad`.`author_name`, `ad`.`author_email`, `ad`.`author_phone`, `ad`.`country_id`, `ad`.`region_id`, `ad`.`city_id`, `ad`.`status`, `ad`.`moder`, `ad`.`rules`, `ad`.`view`, `ad`.`created`, `ad`.`modified`, `ad`.`images`, `ad_ad_modified`.`modify_id`, `ad_ad_modified`.`value`
FROM (`ad`)
LEFT JOIN `ad_ad_modified` ON `ad_ad_modified`.`ad_id` = `ad`.`id`
WHERE `ad`.`category_id` = 3
AND `ad_ad_modified`.`modify_id` = 1
AND `ad_ad_modified`.`value` IN ('Microsoft')
AND `ad_ad_modified`.`modify_id` = 2
AND `ad_ad_modified`.`value` IN ('4')
AND `ad`.`moder` = 1
ORDER BY `ad`.`moder` DESC, `ad`.`created` DESC
LIMIT
20


Так не находит ни одного объявления.
P.S. таблица реально не много другая, но поиск проходит так как описано тут, используя эти же таблицы, поля и генерация запроса будет в таком же виде.

Проблема в том, как составить запрос, чтобы он проходил по базе и искал объявления, которые соответствуют полям из таблицы AD (цена, название, описание), а после проверял соответствия этих объявлений по дополнительным характеристикам из таблицы ad_ad_modified.

Делал похожий запрос, но если в объявления несколько характеристик (а это 99.99% случаев), то запрос находил их все, если ему соответствует одна из характеристик. Это не верно, так как вторая, третья... десятая характеристика не соответствует поиску.

P.S. В какую тему добавлять свой вопрос не знаю, думал в PHP но по идеи это вопрос к MySQL
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.