Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Anagramador de palavras com % de sql


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%'