Mysql
 sql >> Database >  >> RDS >> Mysql

Anagramma di parole con % di sql

Per prima cosa voglio correggere un errore nella tua domanda. Nelle tue domande intendi _ non % . Il % indica un numero qualsiasi di caratteri (zero o più). Usa _ per indicare esattamente un carattere.

Ora passiamo alla soluzione... in realtà non hai bisogno della parola ordinata memorizzata nel database. Potresti semplicemente fare questo:

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 hai lettere duplicate nel tuo input, devi gestirlo correttamente per assicurarti che tutti i risultati contengano tutte le lettere duplicate. Ad esempio se l'input è FOO__ devi controllare che ogni parola corrisponda a entrambi %F% e %O%O% .

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

Si noti che questo approccio richiederà un'analisi completa della tabella, quindi non sarà particolarmente efficiente. Potresti migliorare leggermente le cose memorizzando la lunghezza di ogni parola in una colonna separata e indicizzando quella colonna.

Se hai sortedword quindi puoi migliorare le prestazioni omettendo il % tra lettere duplicate poiché sai che appariranno consecutivamente in sortedword . Ciò potrebbe migliorare le prestazioni perché riduce la quantità di backtracking richiesta per le partite non riuscite.

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

Un altro approccio che richiede sortedword essere presenti è il seguente:

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

Anche in questo caso è necessaria una scansione completa della tabella. Anche in questo caso, se hai lettere ripetute non hai bisogno del % tra loro.

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