ГДЕ ИЛИ ВЫДАТЬ, чтобы получить проверенные предметы - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь создать динамический запрос c, который объединяет мои таблицы и фильтрует выбранные фильтры. В моем примере products_bind_filters - это элементы фильтра, которые принадлежат каждому продукту.

Я пытаюсь найти продукты, которые имеют следующие критерии, в качестве примера в одном результате:

  • Продукты красного, зеленого или синего цвета
  • , также доступные в маленьком или среднем размере

Мой запрос:

SELECT *,
            p.name as productName,
            c.name as categoryName,
            p.price as productPrice,
            p.hookName as productHook,
            c.hookName as categoryHook,
            p.imageMain as productThumb
            FROM products p
            JOIN products_bind_category pbc ON pbc.productsId = p.productsId
            JOIN category c ON pbc.categoryId = c.categoryId
            JOIN products_bind_value pbv ON pbv.productsId = p.productsId
            WHERE p.productsId != '0'
            AND pbc.categoryId = '10'
             AND (pbv.valueId = '54' ) AND (pbv.valueId = '167' OR pbv.valueId = '186' OR pbv.valueId = '175' )
            GROUP BY p.productsId
            ORDER BY p.Price ASC

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

Есть идеи?

Я пытался использовать запрос IN, но он также не работал.

1 Ответ

1 голос
/ 07 февраля 2020

Вы работаете с таблицей ключ / значение, которая всегда довольно сложна.

Это условие:

AND (pbv.valueId = '54')
AND (pbv.valueId = '167' OR pbv.valueId = '186' OR pbv.valueId = '175')

никогда не выполняется, потому что ни одна строка в таблице не может иметь значение 54, а не 54 одновременно.

Одним из способов работы с ключом / значениями является агрегация:

select *
from products p
join products_bind_category pbc on pbc.productsid = p.productsid
join category c on pbc.categoryid = c.categoryid
where p.productsid in
(
  select productsid
  from products_bind_value
  group by productsid
  having sum(valueid = 54) > 0
     and sum(valueid in (167, 196, 175)) > 0
)
order by p.productsid;

SUM(<expression>) > 0) использует тот факт, что в MySQL true = 1, false = 0, кстати.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...