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