Bonjour,
je ne sais pas si le terme de "recherche inversée" est le bon terme.
j'ai une variable du type $string= "le chien est noir"
j'ai une table "regle"
reg_id = 1
reg_critere = "noir"
reg_id = 2
reg_critere = "chien"
Comment puis je construire une requête du genre
SELECT count(reg_id) FROM regle WHERE 1 AND $string CONTIENT 'reg_critere'
En vous remerciant par avance,
(je m'arrache les cheveux depuis des heures ...)
Salut !
Je ne suis pas sur d'avoir tout compris à ton probleme.. mais je tente :
Tu veux le nombre de lignes dont les mots/critères sont compris dans $string c'est ça ?
SELECT COUNT(reg_id) as resultats FROM regle WHERE reg_critere = 'le' OR reg_critere = 'chien' OR reg_critere = 'est' OR reg_critere = 'noir'
Pour construire ce type de requete par rapport à une variable (je suppose que c'est du php) tu peux simplement boucler sur les mots de ta variable $string :
1 - construire un tableau contenant les mots
$mots = explode(' ', $string); // retourne array('le', 'chien', 'est', 'noir')
2 - initialiser la requete SQL :
$req = "SELECT COUNT(reg_id) as resultats FROM regle WHERE 1 = 1";
3 - la construire
foreach($mots as $mot) {
$req .= " OR reg_critere = '$mot'";
}
4 - executer la requete..
Pas tester mais j'espere que c'est ce que tu cherches ;)
Ps: c'est surement pas le plus optimiser, mais en tout cas ca fera le travail ;)
pas tout a fait ...
J'ai mis en exemple une phrase très courte mais ce sont généralement des chaines beaucoup plus longues ... Et je dois en plus en traiter un très grand nombre.
En fait , je cherche simplement à savoir si dans ma chaine il y a un des critères de ma table règle car à ce moment là j'éxécute une action particulière.
Concrétement j'ai en entrée un relevé de compte en csv.
je parcours chaque enregistrement et en analysant le champ libellé de ce listing csv, je voudrais comparer à une liste de critères pour pouvoir imputer cette ligne à un poste. Ex.: si le libellé contient "Electrecite De France" imputer la ligne au poste "EDF".
Tu ne pourras pas faire de miracle malheureusement.
Le mieux que tu puisses faire c'est limiter les mots dans la phrase en suprimant les mots dont le nombre de lettre est inférieur à 2 lettres ou 3 par exemple. Ou à l'inverse plus grand que le plus grand de ta bdd.
Ou alors si tu as pas trop de critères tu en fais un tableau de critère et tu fais un 'in_array()', tu stoques les idées et réalises les actions liées.
J'viens de penser à un truc (et je pense que c'est ce que tu cherches) :
$req = "SELECT * FROM matable WHERE '$string' LIKE CONCAT('%', reg_critere, '%');";
Le soucis de cette technique c'est que la requete pour chaque critere va faire la comparaison sur toute la string (à cause des %).
La technique que je t'ai donné plus haut permet de limiter cela en se concentrant sur la valeur totale de la ligne.
Si ce qui t'embete ce sont les majuscules etc, tu peux toujours utiliser les fonctions php qui te permettront d'éviter ces problemes ;)