Twoje podzapytanie powinno wyglądać tak:
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
to rozwiązanie używa podzapytania GROUP BY. Musisz użyć OR, ponieważ atrybut nie może być jednocześnie pamięcią i kolorem w tym samym wierszu, oba mogą być prawdziwe, ale w różnych wierszach. COUNT(DISTINCT atrybuty.nazwa) zlicza atrybuty liczbowe dla koloru lub pamięci.