Как составить запрос для выборки товаров, соответствующих всем параметрам поиска?

evgkuz

Новичок
Как составить запрос для выборки товаров, соответствующих всем параметрам поиска?

Как составить запрос для выборки товаров, соответствующих всем параметрам поиска?

Есть таблица `goods` с товарами:
product_id
name
price

Также есть таблица `parameter_values` с параметрами:
id
product_id
parameter_id

Т.е. каждый товар может иметь несколько параметров.

Как составить запрос для выборки товаров, соответствующих всем параметрам поиска?

Этот запрос работает, если подставить `OR`, что нужно в нём изменить чтобы он работал с `AND`:
PHP:
$query = “SELECT g.* FROM goods AS g LEFT JOIN parameter_values AS pv ON g.product_id=pv.product_id WHERE pv.parameter_id=’”.$array_parameters[0].”’ AND pv.parameter_id=’”.$array_parameters[1].”’”;
 

evgkuz

Новичок
Автор оригинала: Frol
ты хоть понимаешь разницу между ними?
Естественно.

Если использовать OR , то я получу продукты соответствующие хотя бы одному из параметров.
А мне нужно вывести товары соответствующие всем параметрам.

-~{}~ 29.11.04 00:43:

Причём желательно это сделать одним запросом.

Должен же быть в MySQL для этого какой-нибудь механизм.

-~{}~ 29.11.04 01:02:

Я понимаю, что тот запрос, котрый я привёл, ничего не выводит.
Я привёл его, только для демонстрации проблемы.

-~{}~ 29.11.04 01:03:

Неужели никто не знает, как это сделать одним запросом?
 

evgkuz

Новичок
Автор оригинала: Frol
дак где проблемма?
что ты хочешь?
При объединении таблиц, я не могу проверить каждую запись на соответствие всем параметрам сразу.

-~{}~ 29.11.04 03:09:

Т.е. есть поисковая форма со множеством "checkbox". Выбирая параметры (checkbox'ы) пользователь ограничивает поиск товаров, т.е. выбирает товар с нужными параметрами. Причём товар должен соответствовать одновременно всем, выбранным, параметрам.
 

NEK

Guest
$query = “SELECT g.* FROM goods AS g LEFT JOIN parameter_values AS pv ON g.product_id=pv.product_id WHERE
pv.parameter_id IN ( $array_parameters[0] , $array_parameters[1]) ”;

or

$query = “SELECT g.* FROM goods AS g LEFT JOIN parameter_values AS pv ON g.product_id=pv.product_id WHERE
pv.parameter_id IN ( $array_parameters[0] , $array_parameters[1]) AND g.name LIKE '%hren_znaet_tchto%'”;
 

evgkuz

Новичок
Автор оригинала: NEK
$query = “SELECT g.* FROM goods AS g LEFT JOIN parameter_values AS pv ON g.product_id=pv.product_id WHERE
pv.parameter_id IN ( $array_parameters[0] , $array_parameters[1]) ”;

or

$query = “SELECT g.* FROM goods AS g LEFT JOIN parameter_values AS pv ON g.product_id=pv.product_id WHERE
pv.parameter_id IN ( $array_parameters[0] , $array_parameters[1]) AND g.name LIKE '%hren_znaet_tchto%'”;
Этот не подходит, т.к. мне нужно выбрать товары соответствующие всем параметрам сразу, а не одному из параметров.

Пока я вижу только один, не совсем правильный, выход:
Из этих двух таблиц сделать одну, т.е. добавить параметры в качестве отдельных полей в таблицу `goods`. Это не удобно тем, что администратор должен иметь возможность менять эти параметры, т.е. добавлять новые параметры, удалять их и редактировать. Всё время менять структуру таблицы это не правильно.
Неужели никто с этим не сталкивался?
 

Profic

just Profic (PHP5 BetaTeam)
evgkuz
голым sql-ем ты это не сделаешь. т.к. это 2 РАЗНЫХ строки ответа, то сравнить их между собой не получится.
Выход: - использовать логику на php.
 

evgkuz

Новичок
Автор оригинала: Profic
evgkuz
голым sql-ем ты это не сделаешь. т.к. это 2 РАЗНЫХ строки ответа, то сравнить их между собой не получится.
Выход: - использовать логику на php.
А какже я буду делать постраничный вывод?
 

Profic

just Profic (PHP5 BetaTeam)
evgkuz
тебе еще и постраничный вывод...
[sql]
SELECT g.* FROM goods AS g LEFT JOIN (SELECT product_id, count(product_id) AS cnt FROM parameter_values WHERE parameter_id in (...) GROUP BY product_id HAVING cnt > '<кол-во параметров>') AS pv ON g.product_id=pv.product_id
[/sql]
не преверял, но идея должна быть понятна
запрос для mysql 4.1. как переписать, чтобы работало в <4.1 сам догадаешься

-~{}~ 29.11.04 13:44:

в предыдущем посте немного не то
[sql]
SELECT g . * FROM goods AS g WHERE product_id IN (SELECT product_id FROM parameter_values WHERE parameter_id IN (. . .) GROUP BY product_id HAVING count(product_id) > '<кол - во параметров>')
[/sql]
вот это по идее должно работать :)
если не будет, то додумай сам :)
 
Сверху