За последние 24 часа нас посетили 51703 программиста и 1766 роботов. Сейчас ищут 833 программиста ...

Фильтрация товара

Тема в разделе "PHP и базы данных", создана пользователем ALEXU, 1 авг 2012.

  1. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    Доброго времени суток.

    Есть запрос
    Код (Text):
    1. SELECT * FROM products p WHERE ".join(' AND ', $join)."
    при выборе определенных значений в блоке фильтрации я получаю массив с параметрами для фильтрации
    Код (Text):
    1. Array
    2. (
    3.     [par] => Array
    4.         (
    5.             [0] => 1
    6.             [1] => 1
    7.         )
    8.  
    9.     [val] => Array
    10.         (
    11.             [0] => 1
    12.             [1] => 2
    13.         )
    14. )
    par - это параметры, val - значения параметров.
    в данном случае
    par 1 -> val 1
    par 1 -> val 2
    par - это параметр Цвет
    val - Красный, Синий

    Перед запросом, который указан выше я составляю условия для выборки на основе получаемых данных.
    Просто как пример, для выборки по определенной категории товаров
    Код (Text):
    1. if (isset($get['category']) && is_numeric($get['category']))
    2. {
    3.     $join[] = " (categories_id = '".$get['category']."') ";
    4. }
    Т.е. если в гете приходит category, то фильтрую еще и по ней.

    Но вот столкнулся с проблемой.
    Суть этой фильтрации в том, чтобы находить товары по определенным параметрам, которые есть в каждом товаре.
    К примеру товар
    "Зонтик №1" - имеет цвета на выбор Красный, Синий.
    "Зонтик №2" - имеет цвета на выбор Красный.

    Условие которое я использую для выборки параметров
    Код (Text):
    1. if (isset($get['val']))
    2. {
    3.     if (is_array($get['val']))
    4.     {
    5.         $join[] = " products_id IN (
    6.             SELECT product_id, value_id
    7.             FROM product_to_param
    8.             WHERE product_id = products_id AND value_id IN (".implode(',',$get['val']).")
    9.         ) ";
    10.     }
    11. }
    в implode(',',$get['val']) я получаю ID значений(цветов) через запятую для выборки по ним.
    Но проблема в том, что выводятся товары у которых совпадет да же одно из значений.
    А мне нужно выводить только те, у которых есть сразу ВСЕ значения указанные в $get['val'].
    Тупо застрял тут. не знаю что делать(
     
  2. jenya777777

    jenya777777 Активный пользователь

    С нами с:
    16 мар 2010
    Сообщения:
    562
    Симпатии:
    0
    попробуй делать не через join[], а через конкатенацию. join .=
     
  3. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    не очень понял, что меняет. результат одинаков.

    У меня в запросе получается, к примеру value_id IN (1,15)
    товара у которого есть значения с ID 15 нет, соответственно, вернуть нужно 0 Да же, если по другим значениям есть совпадения.
    А мне возвращает товары, у которых есть значение с ID 1.
    С одной стороны это то же не плохо. Но отсев нужен именно по привязанным сразу всем значениям, а не по любым совпадениям.

    Добавлено спустя 52 минуты 46 секунд:
    получилось. но уж очень наверное ресурсоемко будет.
    Код (Text):
    1. if (isset($get['val']))
    2. {
    3.    if (is_array($get['val']))
    4.    {
    5.       foreach($get['val'] AS $k => $v)
    6.       {
    7.          $join[] = " products_id IN (
    8.             SELECT product_id, value_id
    9.             FROM product_to_param
    10.             WHERE product_id = products_id AND value_id IN (".$v.")
    11.          ) ";
    12.       }
    13.    }
    14. }
    Можно как-то оптимизировать это?