1 2 3
| case when colonne1 = '$critere1' then 1 else 0 end +
case when colonne2 = '$critere2' then 1 else 0 end +
case when colonne3 = '$critere3' then 1 else 0 end as nb_critere |
devrait permettre de trié sur le nb_critere desc pour avoir ceux qui en remplissent le plus en 1er.
Ce CASE sera à générer dynamiquement en fonction des critères sélectionnés.
Plutôt que de stocker le résultat de la requête, ce qui peut être coûteux si la requête renvoie un très grand nombre de ligne (nécessite de stocker l'intégralité du résultat même si l'utilisateur ne consulte que 10 lignes), vous pourriez stocker le résultat du select complexe avec jointure.
Sur oracle, j'utiliserai une vue matérialisée rafraichie périodiquement avec des index bitmap sur les colonnes de filtre utilisée dans les conditions OR.
Mais mysql ne propose ni vue matérialisée ni index bitmap, cependant vous pouvez toujours avoir une table qui stocke le résultat de la requête et un cron qui rafraichie périodiquement cette table, et utiliser des index classique.
Le SELECT de recherche avec les critères dynamiques s'appuiera sur cette table.
Après tout dépend de la volumétrie de base, le SELECT complexe peut être très efficace sans avoir besoin de stocker son résultat.
Partager