recherche lettres dans mysql

WRInaute occasionnel
Salut,

je cherche à faire une requete MySQL et je rame un peu

j'ai une table dico (id;mot) avec plein de mots bien orthographiés

ex:
Je veux récupérer le mot "SOLEIL" si j'envoi les lettres dans le désordre. "OSLEIL" par ex. Je veux donc tous les résultats qui ont le meme nombre de lettre et les meme lettres

Quelqu'un peux m'aider ?

Merci?
 
WRInaute occasionnel
Merci abcweb, ca me semble lourd comme soluce.
Je continue de chercher avec du rlike je pense que ca doit etre possible….
 
WRInaute passionné
Moi je ferais un bout en PHP pour construire la requête avec un IN( ) listant toutes les possibilités. La requête n'est pas lancée à partir d'un langage comme PHP ?
 
Nouveau WRInaute
Moi j'ajouterais une colonne supplémentaire motTrié à la table dico qui contiendrait toutes les lettres du mot triées par ordre alphabétique. Pour rester sur l'exemple donné, ça reviendrait à :
Code:
1:MAISON:AIMNOS
2:AIMONS:AIMNOS

Cette colonne est à initialiser en batch lors du chargement de la table dico ou de l'ajout de nouveaux mots.

Pour l'utiliser, il faut préalablement retravailler la chaine à rechercher pour trier les lettres par ordre alphabétique et lancer la requête sur la nouvelle colonne motTrié. On a ainsi tous facilement tous les mots qui correspondent à l'anagramme sans avoir à écrire des requêtes trop complexes
 
Dernière édition:
WRInaute occasionnel
@rick38, oui je suis en php

Je débute vraiment avec les expression régulière mais quand je fais ca, ca fonctionne presque :

Avec les lettres dur mot "soleil". par contre "[L]{2}" me limite qu'aux mots qui ont 2 'L' consécutifs alors qu'il me faudrait 2 'L' m'importe où dans le mot. Une idée ?

Code:
SELECT * FROM table where  LENGTH(mot)=6 AND mot rlike "[S]{1}" and mot rlike "[O]{1}" and mot rlike "[L]{2}" and mot rlike "[E]{1}" and mot rlike "[I]{1}"


Merci
 
WRInaute impliqué
@chava2b Nico998 t'a donné "la" bonne solution.
Mais si tu insistes pour faire un système bidouillesque et peu performant :
SELECT *
FROM table
WHERE LENGTH(mot)=6
AND mot LIKE "%S%"
AND mot LIKE "%O%"
AND mot LIKE "%L%L%"
AND mot LIKE "%E%"
AND mot LIKE "%I%"

Si tu as beaucoup de données, ça va être l'enfer car MySQL ne peut pas utiliser d'indexe. Alors que si tu prépares un champ avec les lettres en ordre alphabétique, en minuscules, sans accents (si tu ne veux pas distinguer un é d'un e), tu peux avoir un champ indexé, et MySQL pourra sélectionner instantanément ce que tu souhaites trouver.
 
WRInaute impliqué
Dans le passé, dans un tuto il existait un script tout fait que j'avais copié et que je trouvais extraordinaire sur le site de dévellopez.net. Un jour, il n'a plus fonctionné. Je ne sais pas comment faire pour retrouver ce lien qui date de plusieurs années, on ne sait pas combien de temps reste archivés les cours et tutoriaux sur le site.
Ce " professeur" en informatique avait réalisé pour les cruciverbistes tous les mots possibles avec des lettres commençant par 2 puis 3 puis 4, ainsi de suite.
 
Nouveau WRInaute
Code:
SELECT * FROM dico WHERE mot REGEXP 'S|O|L|E|I|L' AND LENGTH(mot) = LENGTH('SOLEIL')
Malheureusement non, ça ne marchera pas. Tous les mots de 6 lettres ayant un S ou O ou L ou E ou I sont affichés. On retrouvera aussi bien des mots comme MOBILE ou POSTER

Le précalcul des lettres triées simplifie énormément l'algorithme de recherche et facilite le travail à la base de données donc son temps de réponse surtout en utilisant un index comme l'indique @colonies . Cette solution ne présente que des avantages
 
WRInaute occasionnel
Merci pour vos réponses ;)

colonies, le like consomme plus de temps que le rlike. Le dico est fixe, donc j'ai indexé tous les mots. Mon dédié semble tenir le coup. D'ici peu, je mettrai la solution de nico998 car elle semble la plus efficace


Voici ce que j'ai fait pour le moment par exemple avec le mot "SOLEIL" :

Code:
SELECT mot FROM dico WHERE mot RLIKE "[S]{1}" AND mot RLIKE "[O]{1}" AND mot RLIKE "[L]{1}.*[L]{1}" AND mot RLIKE "[E]{1}" AND mot RLIKE "[I]{1}"
 
Discussions similaires
Haut