Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Selecione produtos por vários atributos, usando o concatenador AND em vez de OR, modelo de dados EAV


Sua subconsulta deve ficar assim:
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

esta solução usa uma subconsulta GROUP BY. Você tem que usar OR porque o atributo não pode ser Memória e Cor ao mesmo tempo na mesma linha, ambos podem ser verdadeiros, mas em linhas diferentes. COUNT(DISTINCT attribute.name) conta o número de atributos que Color ou Memory, se for 2, então há pelo menos 1 linha onde a primeira condição é verdadeira e 1 linha onde a outra também é verdadeira.