आपकी वर्तमान क्वेरी विरोधाभासी है क्योंकि एक पंक्ति कभी भी WHERE क्लॉज से मेल नहीं खा सकती है। मुझे लगता है कि आप ऐसा कुछ चाहते हैं।
SELECT product_id
FROM table
WHERE (key='free_shipping' and value='yes') or (key='price' and value='5')
GROUP BY product_id
HAVING COUNT(DISTINCT key) = 2