За последние 24 часа нас посетили 53577 программистов и 1719 роботов. Сейчас ищут 943 программиста ...

Изменить логику запроса фильтров opencart

Тема в разделе "MySQL", создана пользователем oolleegg55, 13 май 2014.

  1. oolleegg55

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

    С нами с:
    13 май 2014
    Сообщения:
    24
    Симпатии:
    3
    Добрый день!
    Не могу поменять логику запроса, прошу помощи.
    Суть вот в чем:
    Есть запрос к базе, который формирует Opencart для выборки товаров с применением фильтров.
    Запрос целиком:
    Код (Text):
    1.  
    2. SELECT DISTINCT SQL_CALC_FOUND_ROWS p.product_id, (SELECT AVG(rating) AS total FROM oc_review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM oc_product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '1' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < '2014-05-13 08:35:00') AND (pd2.date_end = '0000-00-00' OR pd2.date_end > '2014-05-13 08:35:00')) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM oc_product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < '2014-05-13 08:35:00') AND (ps.date_end = '0000-00-00' OR ps.date_end > '2014-05-13 08:35:00')) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special FROM oc_category_path cp LEFT JOIN oc_product_to_category p2c ON (cp.category_id = p2c.category_id) LEFT JOIN oc_product_filter pf ON (p2c.product_id = pf.product_id) LEFT JOIN oc_product p ON (pf.product_id = p.product_id) LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= '2014-05-13 08:35:00' AND p2s.store_id = '0' AND cp.path_id = '1' AND pf.filter_id IN (11,3)  AND (p.price >= "0" AND p.price <= "10000000") GROUP BY p.product_id ORDER BY p.sort_order ASC, LCASE(pd.name) ASC LIMIT 0,15
    Нас интересует только вот эта часть:
    Код (Text):
    1. AND pf.filter_id IN (11,3)
    Как сделать чтобы выборка делалась с логикой "И", а не "ИЛИ"?
    Я пробовал заменить эту часть на:
    Код (Text):
    1. AND pf.filter_id IN (11) AND pf.filter_id IN (3)
    И так:
    Код (Text):
    1. AND pf.filter_id = 11 AND pf.filter_id = 3
    Оба варианта не дают вообще результата.

    Помогите, разобраться.
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    что это значит?
    поле pf.filter_id не может быть равным ОДНОВРЕМЕННО И 3 И 5.

    вы чего вообще хотите сделать? опишите своими словами задачу начальную. а не то что вы начали неправильно делать.
     
  3. oolleegg55

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

    С нами с:
    13 май 2014
    Сообщения:
    24
    Симпатии:
    3
    Скриншот фильтров магазина:
    http://joxi.ru/jstxU_3JTJC_VNNPR7s
    Эти фильтры (11, 3) из разных групп. И при действующем алгоритме, при их выборе, товары из этих фильтров суммируются. Отбираются все браслеты и все белокрасные. А нужно, чтобы показывались белокрасные браслеты.
     
  4. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    попробуйте так:
    после
    Код (PHP):
    1. LEFT JOIN oc_product_filter pf  ON (p2c.product_id = pf.product_id)
    добавьте еще
    Код (PHP):
    1. LEFT JOIN oc_product_filter pf2 ON (p2c.product_id = pf2.product_id)
    и вместо
    Код (PHP):
    1. AND pf.filter_id IN (11,3)
    напишите
    Код (PHP):
    1. AND pf.filter_id IN (11)
    2. AND pf2.filter_id IN (3)
     
    ShadowCoder нравится это.
  5. oolleegg55

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

    С нами с:
    13 май 2014
    Сообщения:
    24
    Симпатии:
    3
    Спасибо большое!
    Похоже, это то что нужно.
    Сейчас реализую программную часть, для формирования таких запросов, и будет понятно, на сколько это решение универсальное. Отпишусь по результатам.
     
  6. oolleegg55

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

    С нами с:
    13 май 2014
    Сообщения:
    24
    Симпатии:
    3
    Не получилось написать сразу. Но лучше поздно, как говорится.
    Это решение оказалось действительно рабочее. Все работает именно так, как нужно. Спасибо еще раз!