Het klinkt alsof je GROUP BY . moet gebruiken en HAVING clausules.
SELECT
`product_id`,
COUNT (`primary_key_id`) AS `attr_count` /* primary key field here */
FROM `products_attr_val`
WHERE
(`attr_id` = ? AND `value_id` = ?)
OR (`attr_id` = ? AND `value_id` = ?)
/* additional as necessary
OR (`attr_id` = ? AND `value_id` = ?)
*/
GROUP BY `product_id`
HAVING `attr_count` = ? /* value here should be equal to number of attributes you are checking for */
Zorg ervoor dat u een unieke index heeft voor product_id en attr_id om dit correct te laten werken (u zou dit al moeten hebben omdat het waarschijnlijk niet logisch is dat een product meerdere records heeft met dezelfde attr_id ).
U moet er ook voor zorgen dat u uw waarden ontwijkt voor gebruik in uw SQL, als u dat nog niet bent. Ik laat deze variabelen hier zien met ? wat, als we voorbereide verklaringen gebruiken, een manier zou zijn om deze SQL te schrijven.