Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wortanagrammer mit SQL's %

Zuerst möchte ich einen Fehler in Ihrer Frage korrigieren. In Ihren Abfragen meinen Sie _ nicht % . Der % bedeutet eine beliebige Anzahl von Zeichen (null oder mehr). Verwenden Sie _ genau ein Zeichen bedeuten.

Nun zur Lösung ... Sie brauchen das in der Datenbank gespeicherte sortierte Wort nicht wirklich. Sie könnten einfach Folgendes tun:

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

Wenn Ihre Eingabe doppelte Buchstaben enthält, müssen Sie dies korrekt handhaben, um sicherzustellen, dass alle Ergebnisse alle doppelten Buchstaben enthalten. Zum Beispiel, wenn die Eingabe FOO__ ist Sie müssen überprüfen, ob jedes Wort mit %F% übereinstimmt und %O%O% .

SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND word LIKE '%F%'
AND word LIKE '%O%O%'

Beachten Sie, dass dieser Ansatz einen vollständigen Scan der Tabelle erfordert und daher nicht besonders effizient ist. Sie könnten die Dinge etwas verbessern, indem Sie die Länge jedes Wortes in einer separaten Spalte speichern und diese Spalte indizieren.

Wenn Sie sortedword haben dann können Sie die Leistung verbessern, indem Sie % weglassen zwischen doppelten Buchstaben, da Sie wissen, dass sie nacheinander in sortedword erscheinen . Dies könnte die Leistung verbessern, da es die Menge an Backtracking reduziert, die für fehlgeschlagene Übereinstimmungen erforderlich ist.

SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%'
AND sortedword LIKE '%OO%'

Ein weiterer Ansatz, der sortedword erfordert anwesend zu sein ist wie folgt:

SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%D%O%R%W%'

Auch dies erfordert einen vollständigen Scan der Tabelle. Nochmals, wenn Sie wiederholte Buchstaben haben, brauchen Sie den % nicht zwischen ihnen.

SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%OO%'