Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/05/2011, 19h12   #1
Membre à l'essai
 
Inscription : mars 2005
Messages : 60
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 60
Points : 22
Points : 22
Par défaut [PHP/MySQL] Recherche multicritères "souple" avec score

Bonjour,

Je cherche depuis quelque temps à faire une requête MySQL pour faire une recherche à partir de n critères mais de manière "souple", l'idée étant que la requête ne remonte pas uniquement les enregistrements matchant exactement aux n critères donnés, mais aussi ceux qui matcheraient avec 1 à n-1 critères. Un champ virtuel "score" doit cependant être construit afin de sanctionner la pertinence des enregistrements remontés, à savoir : 100% si l'on matche avec tous les n critères, 100*(n-1/n)% si l'on matche avec n-1 critères, ... et ainsi de suite (on remonte bien entendu rien si l'on ne matche avec aucun critère).

Code :
1
2
3
4
5
6
7
8
 
SELECT matable.id, score FROM matable WHERE -- score est "virtuel"
  test1 -- si test1 est vrai, score recoit 20% de plus dans cet exemple
  test2 -- si test1 est vrai, score recoit 20% de plus dans cet exemple
  test3 -- si test1 est vrai, score recoit 20% de plus dans cet exemple
  test4 -- si test1 est vrai, score recoit 20% de plus dans cet exemple
  test5 -- si test1 est vrai, score recoit 20% de plus dans cet exemple
ORDER BY score DESC
J'aurais pu arriver à ce résultat de manière "crade" en faisant toutes les combinaisons possibles de requêtes selon les critères, et faire ma sauce (en PHP dans mon cas), mais niveau performance je pense que ça n'est pas optimal, d'autant plus que je suis persuadé que MySQL est autosuffisant pour faire ça.
Merci d'avance à ceux qui peuvent m'aider avec leurs idées/bouts de codes/liens...

Joe
yelbied est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 11h54   #2
Membre éprouvé
 
Avatar de Nheo_
 
Homme
Étudiant
Inscription : avril 2011
Messages : 317
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 317
Points : 405
Points : 405
Bonjour,

Je n'ai pas de solution à te proposer, mais tu pourrais utiliser tout simplement des variables avec MySQL : Doc.

Il suffirait d'incrémenter ta variable selon tes tests.

Je précise que je n'ai jamais testé ceci, donc je ne peux rien te garantir .
Nheo_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 12h29   #3
Membre à l'essai
 
Inscription : mars 2005
Messages : 60
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 60
Points : 22
Points : 22
Bonjour Nheo,

Merci pour ta réponse.
Je suis déjà passé par cette doc, mais le souci, comme ils le disent, c'est qu'on peut pas déclarer ET incrémenter une variable dans une même commande (la variable reste toujours à sa valeur d'initialisation).
Donc point mort quoi

Joe
yelbied est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 13h40   #4
Membre à l'essai
 
Inscription : mars 2005
Messages : 60
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 60
Points : 22
Points : 22
Je viens de trouver!
Je laisse ici le code au cas ça servirait à quelqu'un :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
SELECT *, (
  IF(test1, 1, 0) +
  IF(test2, 1, 0) +
  IF(test3, 1, 0) + 
  IF(test4, 1, 0) + 
  IF(test5, 1, 0)
) / 5 * 100 AS score
FROM matable
WHERE
  test1 OR
  test2 OR
  test3 OR
  test4 OR
  test5
ORDER BY score DESC
yelbied est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h54.


 
 
 
 
Partenaires

Hébergement Web