|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre expérimenté
![]() Inscription : septembre 2006 Messages : 685 ![]() |
Bonsoir,
J'ai une liste de mots définie, avec REGEXP, je voudrais sélectionner les lignes de ma table qui contiennent au moins x mots parmi cette liste et ceci peu importe le nombre d'occurences de chaque mot pourvu qu'il y soit au moins une fois, et ceci dans une seule regex(pas autant de regex qu'il n'y a de combinaisons de mots) Par exemple, j'ai une liste "a, b, c, d, e", je voudrais que si mon champ contient: (a et b et c et d) ou (a et b et c et e) ou (a et b et d et e), etc... Donc 4 termes distinct parmi cette liste, que la ligne soit sélectionnée. Par contre si mon champ contenait "a b a c", celle-ci ne devrait pas être sélectionnée, puisque il n'y a que 3 valeurs différentes. Je sais pas si je suis bien clair J'ai tenté plein de chose, mais pas de résultats corrects à chaque fois. J'ai également un problème avec les caractères qui ne sont pas de mots que je n'arrive pas à intégrer dans une classe de caractères, mais ce sera pour plus tard |
|
|
00
|
|
|
#2 | ||
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
pourquoi utiliser des REGEXP ? est-ce que, LIKE ou FIND_IN_SET ne te suffiraient pas ?
Je te propose deux solutions que j'illustre avec REGEXP, mais qui sont adaptables à LIKE ou FIND_IN_SET. Code :
|
||
|
|
00
|
|
|
#3 |
|
Membre expérimenté
![]() Inscription : septembre 2006 Messages : 685 ![]() |
Merci, mais le problème avec LIKE, c'est qu'un mot peut-être contenu dans un autre.
Je pourrais mettre des espaces, du genre LIKE '% clef %' Mais pour un mot en début/fin de chaine, ça poserait problème, et également avec les caractères de ponctuations. En fait, le but est de pouvoir approfondir une recherche en cas de résultat nul après une recherche en FULLTEXT, et également sur des champs en CHAR ou VARCHAR. Et donc je souhaite utiliser ceci afin d'essayer de faire un classement par pertinence, donc si l'utilisateur indique 4 mots, que les résultats retournés soit classés. 1- champs contenant les 4 mots (pas dur) 2- champs contenant 3 mots sur les 4 3- champs contenant 2 mots sur les 4 4- champs contenant 1 des 4 mots C'est sans doute plus clair |
|
|
00
|
|
|
#4 | ||
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Citation:
Citation:
|
||
|
|
00
|
|
|
#5 |
|
Membre expérimenté
![]() Inscription : septembre 2006 Messages : 685 ![]() |
Question sans doute con, mais une table thesaurus, c'est quoi ?
C'est une table temporaire contenant les mots à rechercher, c'est ça ? |
|
|
00
|
|
|
#6 | |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Citation:
|
|
|
|
00
|
|
|
#7 |
|
Membre expérimenté
![]() Inscription : septembre 2006 Messages : 685 ![]() |
Ok, merci, je vais voir pour essayer de faire de cette façon
Par contre une liste définie de mots suceptibles d'être rechercher, c'est pas trop évident à faire. |
|
|
00
|
|
|
#8 | |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Citation:
|
|
|
|
00
|
|
|
#9 |
|
Membre expérimenté
![]() Inscription : septembre 2006 Messages : 685 ![]() |
Effectivement, c'est pour une recherche par mots clefs renseignés par l'utilisateur
|
|
|
00
|
|
|
#10 | ||||
|
Membre expérimenté
![]() Inscription : septembre 2006 Messages : 685 ![]() |
Salut,
J'ai donc opté pour une table TEMP, ça m'a l'air pour l'instant pas trop mal, mais il y a un truc que je n'arrive pas à faire, c'est de compter le nombre de mots clefs totals présent dans un champ. Pour l'instant, je n'ai que le nombre de mots clefs distinct. Ma requête actuelle: Code SQL :
Ce qui me ressort pour un test effectué avec pour mots recherchés: test et message Citation:
Citation:
Une petite idée de comment je pourrais obtenir ceci ? |
||||
|
|
00
|
|
|
#11 | |||
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Citation:
Tu pourais créer une fonction perso, avec un algo de ce genre-là : Code :
|
|||
|
|
00
|
|
|
#12 | |||
|
Membre expérimenté
![]() Inscription : septembre 2006 Messages : 685 ![]() |
Merci, j'ai tenté de faire une fonction, et vu que c'est ma 1ère tentative de création de fonction en SQL, j'ai droit à des erreurs.
J'en suis bloqué à une que je ne comprend pas trop. Voici mon oeuvre Code SQL :
Et l'erreur qui m'est indiquée : Citation:
|
|||
|
|
00
|
|
|
#13 | ||
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
- les variables utilisateur (du genre @toto) sont interdites dans les fonctions
- à la place il faut utiliser des variables locales, qui s'écrivent sans @ et doivent être déclarées avec DECLARE - il te manque un END IF et quelques SET ça devrait donner qqch comme ça (je n'ai pas testé ni cherché à comprendre, juste corrigé la syntaxe) : Code :
|
||
|
|
00
|
|
|
#14 | |||||
|
Membre expérimenté
![]() Inscription : septembre 2006 Messages : 685 ![]() |
Merci
J'y suis presque, mais il me reste un tout petit problème, c'est que si mon mot à rechercher est situé en fin de chaine, il n'est pas pris en compte. Citation:
Code SQL :
Donc c'est la condition Code SQL :
Je pourrais certes faire un CONCAT(ESPACE + champ + ESPACE) dans mon SELECT, mais je préfèrerais que ça soit fait dans la fonction. |
|||||
|
|
00
|
|
|
#15 |
|
Membre expérimenté
![]() Inscription : septembre 2006 Messages : 685 ![]() |
Bon, comme j'ai pas trouvé pourquoi ça déconnait, j'ai ajouté 2 espaces en fin de ma chaine.
En faisant ça, c'est ok. Merci pour tout Antoun |
|
|
00
|
|
|
#16 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Attention, en utilisant LOCATE tu fais l'équivalent d'un LIKE '%motcle%'. Autrement dit, tu ne détecte plus les débuts et fins de mot comme tu le faisais avec REGEXP.
C'est pour cela que dans mon algo je prévoyais un REGEXP sur longClef + 2, afin d'avoir un caractère avant et un caractère après. |
|
|
00
|
|
|
#17 |
|
Membre expérimenté
![]() Inscription : septembre 2006 Messages : 685 ![]() |
Pour l'instant ça fonctionne bien, j'ai testé avec testx et xtest et ils ne sont pas compter dans le résultat.
J'essaierais d'optimiser ça, quand je me débrouillerais ujn peu mieux avec les fonctions MySQL. |
|
|
00
|
|
|
#18 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Code :
select nombreClefChamp('toto test xtest truc', 'test') Code :
select nombreClefChamp('toto test testx truc', 'test') |
|
|
00
|
|
|
#19 | |||||
|
Membre expérimenté
![]() Inscription : septembre 2006 Messages : 685 ![]() |
Ah oui, j'avais également modifié d'autres critères dans la fonction, et son nom aussi, COUNT_WORD ça fait plus classe
La fonction finale que j'ai : Code SQL :
Avec celle-là, seul les mots stricts sont bien inclus dans le comptage. Et sur mon tout 1er exemple Code SQL :
J'obtiens Citation:
|
|||||
|
|
00
|
|
|
#20 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
impec, bravo pour ta première fonction dans MySQL !
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com