Primeiro quero corrigir um erro na sua pergunta. Em suas consultas, você quer dizer
_
não %
. O %
significa qualquer número de caracteres (zero ou mais). Usar _
para significar exatamente um caractere. Agora vamos para a solução... na verdade você não precisa da palavra ordenada armazenada no banco de dados. Você poderia apenas fazer isso:
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%'
Se você tiver letras duplicadas em sua entrada, precisa lidar com isso corretamente para garantir que todos os resultados contenham todas as letras duplicadas. Por exemplo, se a entrada for
FOO__
você precisa verificar se cada palavra corresponde a %F%
e %O%O%
. SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND word LIKE '%F%'
AND word LIKE '%O%O%'
Observe que essa abordagem exigirá uma verificação completa da tabela, portanto, não será particularmente eficiente. Você pode melhorar um pouco as coisas armazenando o comprimento de cada palavra em uma coluna separada e indexando essa coluna.
Se você tiver
sortedword
então você pode melhorar o desempenho omitindo o %
entre letras duplicadas, pois você sabe que elas aparecerão consecutivamente em sortedword
. Isso pode melhorar o desempenho porque reduz a quantidade de retrocesso necessária para correspondências com falha. SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%'
AND sortedword LIKE '%OO%'
Outra abordagem que requer
sortedword
estar presente é o seguinte:SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%D%O%R%W%'
Novamente, isso requer uma varredura completa da tabela. Novamente, se você tiver letras repetidas, não precisará do
%
entre eles. SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%OO%'