Как выбрать записи, которые соответствуют нескольким значениям в таблице связей, с помощью оператора соединения MySQL? - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь исправить запрос, используемый для фильтрации товаров, который отлично работает для одной категории, но очень ошибочен, когда выбрано несколько категорий. В настоящее время в запросе выбираются все продукты, чьи идентификаторы совпадают с одним cat_id ИЛИ другим, что является началом, но я не могу понять, как получить продукты, чьи идентификаторы совпадают ОБА, выбранные с номерами cat_id в category_linked.

Вот пример запроса, который в данный момент выполняется, когда выбраны два фильтра:

SELECT A.* FROM products A LEFT JOIN categories_linked B ON A.id = B.prod_id WHERE (B.cat_id = 1 || B.cat_id = 2) GROUP BY A.id;

Например, если бы я отфильтровал по cat_id 1 и 2, я хотел бы вернуть продукт с идентификатором 1, но в настоящее время он возвращает продукты с идентификаторами 1, 2 и 3. Предложение WHERE генерируется динамически, поэтому, если его можно поддерживать, даже лучше.

Categories_linked

cat_id|prod_id|
------+-------+
     1|      1|
     1|      2|
     2|      1|
     2|      3|

products

id |title |
---+------+
  1| item1|   
  2| item2|  
  3| item3|    

1 Ответ

0 голосов
/ 27 апреля 2020

Спасибо / u / r3pr0b8 на Reddit за помощь, когда не удивительно, что SO не будет.

SELECT products.* 
  FROM ( SELECT prod_id
          FROM categories_linked  
          WHERE cat_id IN ( 1 , 2 )
         GROUP
             BY prod_id
         HAVING COUNT(DISTINCT cat_id) = 2
       ) AS these       
INNER
  JOIN products
    ON products.id = these.prod_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...