Нет смысла использовать 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