SELECT COUNT(1) FROM (
SELECT class_a.id
FROM class_a
LEFT JOIN `class_p`
ON `class_a`.id = `class_p`.p_id
WHERE class_a.cat_id = 1
AND (`caption`,`value`) IN (('type','1'), ('type_2','2'))
GROUP BY class_a.id
HAVING COUNT(DISTINCT caption, value) = 2;
) AS tmp