Anagramador de palabras con % de sql

Necesito crear un script que busque palabras con 'espacios en blanco', que básicamente son % en sql.

$numberofblanks = 1; //max 13
$searchedword = "WORD";
$searchedwordsorted = "DORW";

Los resultados dados deben ser:
PALABRAS MUNDO MULTITUD ESPADA PALABRAS DOTE ROWED DROWN DOWER ROWDY

%palabra, palabra%, palabra%, palabra% serviría, pero ¿qué pasa con consultas más complicadas, con 2 o más espacios en blanco?
También me preguntaba si $searchedwordsorted es útil o realmente no importa y es solo una pérdida de espacio en mi mesa.

Gracias amablemente por su ayuda chicos.
.Miguel

preguntado el 26 de agosto de 12 a las 12:08

Según Documentación de MySQL % Matches any number of characters, even zero characters y no solo espacios en blanco. -

Bueno, podría usar su palabra de búsqueda ordenada, ordenar todas las palabras en la base de datos, insertar un comodín después de cada carácter y luego buscar este patrón. Debería encontrar todas las coincidencias posibles (pero probablemente sea lento) -

1 Respuestas

Primero quiero corregir un error en tu pregunta. En tus consultas te refieres _ no %. % 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 ambas %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 %

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

Respondido 26 ago 12, 12:08

Vale genial. Definitivamente mejoraré mi tabla agregando 'longitud de palabra'. Ahora, ¿qué pasa con consultas más complicadas como WOOORD****? ($númerodeespacios en blanco= 4). - Michael

@Michal: el único cambio que debe hacer al agregar un espacio en blanco es cambiar WHERE wordlength = 9 a WHERE wordlength = 10, por ejemplo. No es necesario cambiar nada más en ninguna de las dos consultas. Es decir, quieres WHERE wordlength = $numberofblanks + $numberofnonblanks. - marca byers

Fantástico. Muchas gracias por su ayuda. Volveré al tema, cuando termine y será necesario resolver "SUBANAGRAMAS" :) SUBANAGRAMAS = dow, row, dor, rod, ow, wo, do, od, o (todas las palabras existentes que contienen letras de $palabraordenada). - Michael

Ok, se agregó la longitud de palabra de la columna. Supongo que ahora istnead de WHERE CHAR_LENGTH(word) = 5 Podría usar WHERE wordlength = 5. ¿Es eso correcto? - Michael

@Michal: Sí. Ese cambio dará una mejora en el rendimiento. Indexación (wordlength, sortedword, word) probablemente también ayudará. - marca byers

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.