Først vil jeg rette en fejl i dit spørgsmål. I dine forespørgsler mener du _
ikke %
. %
betyder et vilkårligt antal tegn (nul eller mere). Brug _
betyder præcis ét tegn.
Nu til løsningen... du behøver faktisk ikke det sorterede ord gemt i databasen. Du kunne bare gøre dette:
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%'
Hvis du har duplikerede bogstaver i dit input, skal du håndtere dette korrekt for at sikre, at alle resultater indeholder alle de duplikerede bogstaver. For eksempel hvis input er FOO__
du skal kontrollere, at hvert ord matcher begge %F%
og %O%O%
.
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND word LIKE '%F%'
AND word LIKE '%O%O%'
Bemærk, at denne fremgangsmåde kræver en fuld scanning af tabellen, så den vil ikke være særlig effektiv. Du kan forbedre tingene lidt ved at gemme længden af hvert ord i en separat kolonne og indeksere den kolonne.
Hvis du har sortedword
så kan du forbedre ydeevnen ved at udelade %
mellem duplikerede bogstaver, da du ved, at de vil blive vist fortløbende i sortedword
. Dette kan forbedre ydeevnen, fordi det reducerer mængden af backtracking, der kræves for mislykkede matches.
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%'
AND sortedword LIKE '%OO%'
En anden tilgang, der kræver sortedword
at være til stede er som følger:
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%D%O%R%W%'
Igen kræver dette en fuld scanning af tabellen. Igen, hvis du har gentagne bogstaver, behøver du ikke %
mellem dem.
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%OO%'