sql >> Database teknologi >  >> RDS >> Mysql

Word anagrammer med sql's %

Først vil jeg rette en fejl i dit spørgsmål. I dine forespørgsler mener du _ ikke % . % betyder et vilkårligt antal tegn (nul eller mere). Brug _ betyder præcis ét tegn.

Nu til løsningen... du behøver faktisk ikke det sorterede ord gemt i databasen. Du kunne bare gøre dette:

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

Hvis du har duplikerede bogstaver i dit input, skal du håndtere dette korrekt for at sikre, at alle resultater indeholder alle de duplikerede bogstaver. For eksempel hvis input er FOO__ du skal kontrollere, at hvert ord matcher begge %F% og %O%O% .

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

Bemærk, at denne fremgangsmåde kræver en fuld scanning af tabellen, så den vil ikke være særlig effektiv. Du kan forbedre tingene lidt ved at gemme længden af ​​hvert ord i en separat kolonne og indeksere den kolonne.

Hvis du har sortedword så kan du forbedre ydeevnen ved at udelade % mellem duplikerede bogstaver, da du ved, at de vil blive vist fortløbende i sortedword . Dette kan forbedre ydeevnen, fordi det reducerer mængden af ​​backtracking, der kræves for mislykkede matches.

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

En anden tilgang, der kræver sortedword at være til stede er som følger:

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

Igen kræver dette en fuld scanning af tabellen. Igen, hvis du har gentagne bogstaver, behøver du ikke % mellem dem.

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



  1. SQL-forespørgsel efter flere tabeller med flere joinforbindelser og kolonnefelt med kommasepareret liste

  2. Kolonne Afhænger af anden kolonne

  3. Arbejde med JDBC Data i Domo

  4. MYSQL-tabeloprettelse med standardværdi (udtryk) til en kolonne