Фильтр товаров по характеристикам

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
 

b1f

Новичок
Ответ подсказали на другом форуме. Спасибо.
Код:
SELECT  *, count(*) as cnt FROM `ad_ad_modified`
JOIN `ad` ON ad.id=ad_ad_modified.ad_id
// Поиск по таблице с характеристиками
WHERE (
    (ad_ad_modified.modify_id = 5 AND ad_ad_modified.value = 'Новое') OR
    (ad_ad_modified.modify_id = 6 AND ad_ad_modified.value = 'Лето') OR
    (ad_ad_modified.modify_id = 2 AND ad_ad_modified.value = '185')
    )
// Поиск по таблице с объявлениями (товарами)
AND ad.author_name = 'Сергей'
GROUP BY ad_ad_modified.ad_id  HAVING cnt = 3
 
Сверху