Mysql
 sql >> Base de données >  >> RDS >> Mysql

Anagrammeur de mots avec % de sql

Je veux d'abord corriger une erreur dans votre question. Dans vos requêtes, vous voulez dire _ pas % . Le % signifie n'importe quel nombre de caractères (zéro ou plus). Utilisez _ signifier exactement un caractère.

Passons maintenant à la solution... vous n'avez pas réellement besoin du mot trié stocké dans la base de données. Vous pouvez simplement faire ceci :

SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 6
AND word LIKE '%W%'
AND word LIKE '%O%'
AND word LIKE '%R%'
AND word LIKE '%D%'

Si vous avez des lettres en double dans votre entrée, vous devez les gérer correctement pour vous assurer que tous les résultats contiennent toutes les lettres en double. Par exemple, si l'entrée est FOO__ vous devez vérifier que chaque mot correspond à la fois %F% et %O%O% .

SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND word LIKE '%F%'
AND word LIKE '%O%O%'

Notez que cette approche nécessitera une analyse complète de la table, elle ne sera donc pas particulièrement efficace. Vous pourriez améliorer légèrement les choses en stockant la longueur de chaque mot dans une colonne séparée et en indexant cette colonne.

Si vous avez sortedword alors vous pouvez améliorer les performances en omettant le % entre les lettres dupliquées puisque vous savez qu'elles apparaîtront consécutivement dans sortedword . Cela pourrait améliorer les performances car cela réduit le nombre de retours en arrière requis pour les correspondances échouées.

SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%'
AND sortedword LIKE '%OO%'

Une autre approche qui nécessite sortedword être présent est le suivant :

SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%D%O%R%W%'

Encore une fois, cela nécessite une analyse complète de la table. Encore une fois, si vous avez des lettres répétées, vous n'avez pas besoin du % entre eux.

SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%OO%'