Требуются условия, охватывающие несколько строк, что предполагает агрегирование. Вы можете объединить таблицы, group by
product, и использовать для фильтрации предложение having
:
select p.id, p.product_name, p.price
from product p
inner join product_category pc on pc.pid = p.pid
inner join category c on c.cid = pc.cid
where c.category_name in ('Men', 'Women')
group by p.pid, p.product_name, p.price
having max(c.category_name = 'Men') = 1 and max(c.category_name = 'Women') = 1
Если вы можете фильтровать по идентификатору категории, а не по имени категории, то вам нужно на одно объединение меньше:
select p.id, p.product_name, p.price
from product p
inner join product_category pc on pc.pid = p.pid
where pc.cid in (1, 2)
group by p.pid, p.product_name, p.price
having max(pc.cid= 1) = 1 and max(pc.cid = 2) = 1