Mysql
 sql >> Database >  >> RDS >> Mysql

Seleziona i prodotti in base a più attributi, utilizzando AND invece del concatenatore OR, Modello dati EAV

La tua sottoquery dovrebbe essere così:

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

questa soluzione utilizza una sottoquery GROUP BY. Devi usare OR perché l'attributo non può essere Memoria e Colore contemporaneamente sulla stessa riga, possono essere entrambi veri ma su righe diverse. COUNT(DISTINCT attributi.nome) conta gli attributi numerici che Coloro o Memoria, se è 2 allora c'è almeno 1 riga in cui la prima condizione è vera e 1 riga in cui anche l'altra è vera.