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

Optimisation MySQL sur le filtrage des paires clé-valeur en tant qu'enregistrements

Cela devrait vous donner ce dont vous avez besoin... Chacune des conditions de la clause "OR"d where, vous pouvez simplement continuer à l'ajouter en tant qu'élément qualifié. Ensuite, ajustez simplement la clause "Avoir" pour qu'elle corresponde au même nombre que les critères que vous autorisez ... J'ai mis la table des relations en premier car cela aurait un ensemble correspondant plus petit sur la "Valeur" de la ville ou des valeurs de type .. . Assurez-vous d'avoir un index sur la table des relations dans la colonne "VALUE".

SELECT STRAIGHT_JOIN
      rel.id_obj
   from 
      relations rel
         join attributes atr
            on rel.id_addr = atr.id
   where 
         ( rel.value = 'Apartment' AND atr.name = 'Type'  )
      or ( rel.value = 'Some City' AND atr.name = 'City' )
   group by 
      atr.id_obj
   having
      count(*) = 2
   limit
      0, 20

Si vous voulez toutes les données d'objet réelles de ces résultats, vous les envelopperiez quelque chose comme...

select obj.*
   from 
      ( complete SQL statement above ) PreQuery
         join Object obj on PreQuery.id_obj = obj.id