Ver Mensaje Individual
  #16 (permalink)  
Antiguo 11/05/2013, 12:08
jurena
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: Excluir palabras de una consulta

No sé si cubrirá todos tus requisitos, pero creo que esta consulta servirá como buen punto de partida. He adaptado la sintaxis que usabas de REGEXP a la propia de MySQL.
Código MySQL:
Ver original
  1. SELECT id, campo
  2. FROM tabla
  3. WHERE campo
  4. REGEXP '[[:<:]][a-z]{0,}para[a-z]{1,}[[:>:]]'

Mataque, creo que si usamos una consulta de este tipo adaptada a la búsqueda, podremos solucionar todo, pero el primer paso es saber si la cadena buscada forma parte de las palabras excluidas. Eso lo resuelves con programación, php o lo que sea. Si no forma parte de ninguna de ellas, esto te bastaría
Código MySQL:
Ver original
  1. SELECT id, campo
  2. FROM tabla
  3. WHERE campo
  4. REGEXP '[[:<:]][a-z]{0,}par[a-z]{0,}[[:>:]]'

pero si forma parte de alguna de ellas, como es el caso de par respecto a para, tienes que cubrir con varios REGEXP unidos por OR todas las posibilidades:
1) una palabra con 'uno o ningún carácter + par'.
2) todas las que tienen 'uno o ningún carácter + par + un carácter distinto de a + ninguno o más caracteres cualquiera.
3) todas las que tienen 'uno o ningún carácer + par+a+más uno o más caracteres'.

Quizás podrías reunir la 1 y 2 en una, pero al menos dos debe haber.

Pero piensa que todo esto se complicará si en lugar de 'par' buscas 'pa' sería algo más complicado.

Y si las búsquedas va a ser del tipo buscar 'pa' pero excluir 'parado', 'panza', 'apalabrado'
entonces yo te recomendaría dejar parte del trabajo al programa con el que tú programas.
Yo haría dos consultas, una con lo seguro, aquellos registros que responden en el where a LIKE '%pa%' AND no se incluye ninguna de las tres palabras (quizás con un índice fulltext, si van a ser palabras de más de 3 caracteres). Eso lo cargaría en otro array específico de resultados definitivos.
La segunda consulta se traería LIKE '%pa%' y además una o varias de esas palabras. Luego mediante programación (PHP, ASP, C++ o el que uses) recorro con funciones (preg_match y preg_match_all por poner un ej. de PHP [puedes pedir ayuda en el foro específico]) y expresiones regulares solo esos registros últimos para comprobar que aparece lo que busco aparte de esas palabras excluidas. Las que pasen este filtro de programación las cargo en el array de resultados definitivos y ya tendré lo que quiero. Piensa que de esa manera las expresiones regulares tan concretas no recorrerán toda la tabla, sino solo los registros que pueden contener los términos excluidos.

Última edición por jurena; 12/05/2013 a las 02:16