Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос с зависимыми подзапросами 
V
    Опции темы
yukodev
Дата 29.5.2013, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.6.2012

Репутация: нет
Всего: нет



Здравствуйте.
На сайте есть система фильтров. Нужно чтоб выборка товаров работала одним запросом.
Основная таблица 'products' - поля  id,name,watch,img
Таблица параметров: 'products_parameters' - поля: product_id,parameter_id,parameters_value_id

Если параметры не выбраны то идет обычная выборка
 
Код

select from products....

Если же параметры выбраны то как сделал я:
1.выбираем все товары
 
Код

select from products....

и берем с них массив id(он нам нужен для следующих запросов с параметрами)
2.Цикл по полученным параметрам
Код

foreach........

в цикле у нас запрос(на орм):
Код

 $products = ORM::factory('product');
        $products = $products->where("id", "", DB::expr(' in (' . implode(",", $prods_ids_arr) . ')'));
        $products = $products->join("products_parameters", "left");
        $products = $products->on("products_parameters.product_id", "=", "products.id");
        $products = $products->and_where("products_parameters.parameter_id", "=", $pid);
        $products = $products->group_by("products.id")->find_all();

В каждой итерации цикла мы ищем товары, выбираем их id в масив, и эти id используем в следующей итерации.
Таким образом фильтрация работает правильно но такой подход очень нагружает систему. 
Можно ли как то это делать одним запросом с зависимыми подзапросами?
PM MAIL   Вверх
Akina
Дата 29.5.2013, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Не можно, а нужно. Будет что-то вроде

Код

SELECT p.id
FROM products p
JOIN products_parameters pp
ON p.id=pp.product_id
WHERE (pp.parameter_id = НомерФильра_1 AND pp.parameters_value_id = ЗначениеФильтра_1)
OR (pp.parameter_id = НомерФильра_2 AND pp.parameters_value_id = ЗначениеФильтра_2)
OR ...
OR (pp.parameter_id = НомерФильра_N AND pp.parameters_value_id = ЗначениеФильтра_N)
GROUP BY p.id
HAVING COUNT(pp.product_id) = N




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
yukodev
Дата 29.5.2013, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.6.2012

Репутация: нет
Всего: нет



А разве используя OR мы не нарушим логику фильтров, ведь должны выбраться товары которые будут иметь все выбранные фильтра, а тут если я не ошибаюсь будут выбраны товары в которых найден хотя бы один из фильтров, замена OR на AND даст нужный результат или появятся дополнительные нюансы?
PM MAIL   Вверх
Akina
Дата 29.5.2013, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(yukodev @  29.5.2013,  15:01 Найти цитируемый пост)
тут если я не ошибаюсь 

Ошибаетесь.
Разберитесь в логике работы запроса, что ли...



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
yukodev
Дата 29.5.2013, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.6.2012

Репутация: нет
Всего: нет



Akina,  Ясно спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0847 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.