sql >> Base de Datos >  >> RDS >> Mysql

Seleccione productos por múltiples atributos, usando AND en lugar de OR concatenador, modelo de datos EAV

Su subconsulta debería ser así:

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 solución utiliza una subconsulta GROUP BY. Debe usar O porque el atributo no puede ser Memoria y Color al mismo tiempo en la misma fila, ambos pueden ser verdaderos pero en filas diferentes. COUNT(Atributos DISTINTOS.nombre) cuenta el número de atributos de Color o Memoria, si es 2, entonces hay al menos 1 fila donde la primera condición es verdadera y 1 fila donde la otra también es verdadera.