sql >> Databáze >  >> RDS >> Mysql

anagramátor slov s % SQL

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



  1. Vyvolání PHP skriptu ze spouštěče MySQL

  2. operace odstranění mysql

  3. Existuje v MySQL způsob, jak implicitně vytvořit primární klíč pro tabulku?

  4. AKTUALIZUJTE všechny hodnoty sloupců ekvivalentní hodnotám sloupců jiných tabulek na základě jejich id