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

  • Автор темы Автор темы evgkuz
  • Дата начала Дата начала

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].”’”;
 
Автор оригинала: Frol
ты хоть понимаешь разницу между ними?
Естественно.

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

-~{}~ 29.11.04 00:43:

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

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

-~{}~ 29.11.04 01:02:

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

-~{}~ 29.11.04 01:03:

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

-~{}~ 29.11.04 03:09:

Т.е. есть поисковая форма со множеством "checkbox". Выбирая параметры (checkbox'ы) пользователь ограничивает поиск товаров, т.е. выбирает товар с нужными параметрами. Причём товар должен соответствовать одновременно всем, выбранным, параметрам.
 
$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%'”;
 
Автор оригинала: 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`. Это не удобно тем, что администратор должен иметь возможность менять эти параметры, т.е. добавлять новые параметры, удалять их и редактировать. Всё время менять структуру таблицы это не правильно.
Неужели никто с этим не сталкивался?
 
evgkuz
голым sql-ем ты это не сделаешь. т.к. это 2 РАЗНЫХ строки ответа, то сравнить их между собой не получится.
Выход: - использовать логику на php.
 
Автор оригинала: Profic
evgkuz
голым sql-ем ты это не сделаешь. т.к. это 2 РАЗНЫХ строки ответа, то сравнить их между собой не получится.
Выход: - использовать логику на php.
А какже я буду делать постраничный вывод?
 
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]
вот это по идее должно работать :)
если не будет, то додумай сам :)
 
Сверху