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