To jest podział relacyjny problem.
Sposób, w jaki sugerujesz, za pomocą COUNT
jest prawdopodobnie najłatwiejszy w MySQL
SELECT product_id
FROM product_attributes pa
WHERE (attribute='size' and value='medium')
OR (attribute='colour' and value='blue')
GROUP BY product_id
HAVING COUNT(DISTINCT CONCAT(attribute,value) ) = 2
Istnieje inne podejście z podwójnym NOT EXISTS
w linkowanym artykule, ale ponieważ MySQL nie obsługuje CTE, co byłoby dość kłopotliwe.