Nejprve chci opravit chybu ve vaší otázce. Ve svých dotazech máte na mysli _
ne %
. %
znamená libovolný počet znaků (nula nebo více). Použijte _
znamená přesně jeden znak.
Nyní k řešení... ve skutečnosti nepotřebujete tříděné slovo uložené v databázi. Můžete to udělat takto:
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%'
Pokud máte ve vstupu duplicitní písmena, je třeba s tím zacházet správně, abyste zajistili, že všechny výsledky budou obsahovat všechna duplicitní písmena. Například pokud je vstup FOO__
musíte zkontrolovat, zda každé slovo odpovídá oběma %F%
a %O%O%
.
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND word LIKE '%F%'
AND word LIKE '%O%O%'
Všimněte si, že tento přístup bude vyžadovat úplné prohledání tabulky, takže nebude zvláště efektivní. Můžete věci mírně vylepšit uložením délky každého slova do samostatného sloupce a indexováním tohoto sloupce.
Pokud máte sortedword
pak můžete zlepšit výkon vynecháním %
mezi duplikovanými písmeny, protože víte, že se budou v sortedword
objevovat za sebou . To by mohlo zlepšit výkon, protože to snižuje množství zpětného sledování potřebného pro neúspěšné shody.
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%'
AND sortedword LIKE '%OO%'
Další přístup, který vyžaduje sortedword
být přítomen je následující:
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%D%O%R%W%'
Opět to vyžaduje úplné skenování tabulky. Opět, pokud máte opakovaná písmena, nepotřebujete %
mezi nimi.
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%OO%'