Bonjour,
Je cherche a créer une requete SQL la plus efficace possible. Je ne demande pas qu'on me donne le code "tout cuit" mais plutôt qu'on me dise comment vous feriez (en français) pour faire de telles requetes.
Soit un élément, décrit par 5 attributs parmi 292.
L'utilisateur décide, via un formulaire et pour chaque attribut de mettre "oui" ou "non" a chaque attribut.
Pour chaque utilisateur sont donc créés et stockés, pour "oui", et pour "non", deux tableaux contenant les identifiants BDD des attributs correspondants.
A partir de ça, je propose aux utilisateurs de voir les éléments en fonction d'un pourcentage de correspondance, c'est à dire :
. correspondance 100% = ramener tous les éléments dont les 5 attributs sont dans le tableau "oui"
. correspondance 80% = ramener tous les éléments qui ont 4 attributs repris dans le tableau "oui" et 1 dans le tableau "non"
. correspondance 60% = tous les éléments qui ont trois attributs "oui" et 2 "non"
. correspondance 40%
J'ai donc créé 4 requêtes dynamiques en PHP qui cherchent les éléments correspondants à chaque correspondance :
. correspondance 100% (facile) :
[...] WHERE attribut 1 IN (liste_oui) AND attribut 2 IN (liste_oui) AND attribut 3 IN (liste_oui) AND attribut 4 IN (liste_oui) AND attribut 5 IN (liste_oui)
ce sont pour les autres correspondances que je trouve que mes requêtes pourraient être plus efficaces :
. correspondance 80% :
[...] WHERE (attribut 1 IN (liste_oui) AND attribut 2 IN (liste_oui) AND attribut 3 IN (liste_oui) AND attribut 4 IN (liste_oui) AND attribut 5 IN (liste_non)) OR (attribut 1 IN (liste_oui) AND attribut 2 IN (liste_oui) AND attribut 3 IN (liste_oui) AND attribut 4 IN (liste_non) AND attribut 5 IN (liste_oui)) OR (attribut 1 IN (liste_oui) AND attribut 2 IN (liste_oui) AND attribut 3 IN (liste_non) AND attribut 4 IN (liste_oui) AND attribut 5 IN (liste_oui)) OR (attribut 1 IN (liste_oui) AND attribut 2 IN (liste_non) AND attribut 3 IN (liste_oui) AND attribut 4 IN (liste_oui) AND attribut 5 IN (liste_oui)) OR (attribut 1 IN (liste_non) AND attribut 2 IN (liste_oui) AND attribut 3 IN (liste_oui) AND attribut 4 IN (liste_oui) AND attribut 5 IN (liste_oui))
. correspondance 60% : même principe mais il faut 2 attributs dans la liste non donc ça fait 10 possibilités
. correspondance 40% : même principe, 10 possibilités
La requête générée pour 80%, 60% et 40% est énorme et surtout lente a exécuter.
Comment feriez-vous ?
Merci d'avance pour toute piste
Partager