Votre sous-requête devrait ressembler à ceci :
SELECT
attributes_entity.product_id
FROM
attributes_entity INNER JOIN attributes
ON attributes_entity.attribute_id=attributes.id
INNER JOIN attributes_values ON
attributes_entity.value_id=attributes_values.id
WHERE
(attributes.name="Memory" AND attributes_values.value="16GB")
OR
(attributes.name="Color" AND attributes_values.value="Gold")
GROUP BY
attributes_entity.product_id
HAVING
COUNT(DISTINCT attributes.name)=2
cette solution utilise une sous-requête GROUP BY. Vous devez utiliser OR car l'attribut ne peut pas être Memory et Color en même temps sur la même ligne, ils peuvent tous les deux être vrais mais sur des lignes différentes. COUNT(DISTINCT attributes.name) compte le nombre d'attributs que Color ou Memory, si c'est 2 alors il y a au moins 1 ligne où la première condition est vraie et 1 ligne où l'autre est également vraie.