Allereerst wil ik een fout in uw vraag corrigeren. In uw zoekopdrachten bedoelt u _
niet %
. De %
betekent een willekeurig aantal tekens (nul of meer). Gebruik _
om precies één teken te betekenen.
Nu naar de oplossing... je hebt het gesorteerde woord dat in de database is opgeslagen niet echt nodig. Je zou gewoon dit kunnen doen:
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%'
Als u dubbele letters in uw invoer heeft, moet u hier correct mee omgaan om ervoor te zorgen dat alle resultaten alle dubbele letters bevatten. Als de invoer bijvoorbeeld FOO__
. is je moet controleren of elk woord overeenkomt met beide %F%
en %O%O%
.
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND word LIKE '%F%'
AND word LIKE '%O%O%'
Houd er rekening mee dat deze aanpak een volledige scan van de tabel vereist, dus het zal niet bijzonder efficiënt zijn. Je zou dingen iets kunnen verbeteren door de lengte van elk woord in een aparte kolom op te slaan en die kolom te indexeren.
Als u sortedword
. heeft dan kunt u de prestaties verbeteren door de %
. weg te laten tussen dubbele letters, omdat je weet dat ze opeenvolgend zullen verschijnen in sortedword
. Dit zou de prestaties kunnen verbeteren, omdat het de hoeveelheid backtracking die nodig is voor mislukte matches vermindert.
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%'
AND sortedword LIKE '%OO%'
Een andere benadering waarvoor sortedword
. vereist is aanwezig zijn is als volgt:
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%D%O%R%W%'
Dit vereist opnieuw een volledige scan van de tabel. Nogmaals, als je herhaalde letters hebt, heb je de %
. niet nodig tussen hen.
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%OO%'