sql >> Base de Datos >  >> RDS >> Mysql

Anagramador de palabras con % de sql

Primero quiero corregir un error en tu pregunta. En tus consultas te refieres a _ no % . El % significa cualquier número de caracteres (cero o más). Usar _ para significar exactamente un carácter.

Ahora vamos a la solución... en realidad no necesita la palabra ordenada almacenada en la base de datos. Podrías hacer esto:

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

Si tiene letras duplicadas en su entrada, debe manejar esto correctamente para asegurarse de que todos los resultados contengan todas las letras duplicadas. Por ejemplo, si la entrada es FOO__ debe verificar que cada palabra coincida con %F% y %O%O% .

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

Tenga en cuenta que este enfoque requerirá un escaneo completo de la tabla, por lo que no será particularmente eficiente. Podría mejorar un poco las cosas almacenando la longitud de cada palabra en una columna separada e indexando esa columna.

Si tiene sortedword entonces puede mejorar el rendimiento omitiendo el % entre letras duplicadas ya que sabes que aparecerán consecutivamente en sortedword . Esto podría mejorar el rendimiento porque reduce la cantidad de retroceso necesaria para las coincidencias fallidas.

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

Otro enfoque que requiere sortedword estar presente es el siguiente:

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

Nuevamente, esto requiere un escaneo completo de la tabla. Nuevamente, si tiene letras repetidas, no necesita el % entre ellos.

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