Mysql
 sql >> Base de données >  >> RDS >> Mysql

Sélectionnez les produits par plusieurs attributs, en utilisant AND à la place du concaténateur OR, modèle de données EAV

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.