MySQL, где IN из объединенной таблицы - PullRequest
0 голосов
/ 17 октября 2019
i have 2 tables (example):

product:

|  id | name                |
|  1  | product1            |
|  2  | product2            |
|  3  | product3            |

product_categories:

|  product_id | category_id |
|      1      |      5      |
|      1      |      3      |
|      2      |      5      |
|      3      |      17     |
|      3      |      5      |

и я хочу выбрать те продукты, чей ID категории 5 и 3.

SELECT p.* 
  FROM products p 
  LEFT 
  JOIN product_categories pc 
    ON pc.product_id = p.id
 WHERE ?

Ответы [ 3 ]

2 голосов
/ 17 октября 2019

Нет смысла использовать LEFT JOIN, так как вам не нужны несопоставленные строки. Группируйте по продукту и задайте условие для продукта, чтобы обе категории были указаны в предложении HAVING:

SELECT p.id, p.name 
FROM products p INNER JOIN product_categories pc 
ON pc.product_id = p.id
WHERE pc.category_id IN (3, 5)
GROUP BY p.id, p.name
HAVING COUNT(DISTINCT pc.category_id) = 2
1 голос
/ 17 октября 2019

Вы можете написать так:

SELECT p.* FROM products p 
LEFT JOIN product_categories pc ON (pc.product_id = p.id) 
WHERE category_id IN (5,3)
0 голосов
/ 17 октября 2019
SELECT p.* FROM products p LEFT JOIN product_categories pc ON (pc.product_id = p.id) AND pc.category_id in (3,5);

(in case you do want unmatched rows)

Или

SELECT p.* FROM products p INNER JOIN product_categories pc ON (pc.product_id = p.id) WHERE pc.category_id in (3,5)

(if you're sure that you don't)
...