Ver Mensaje Individual
  #3 (permalink)  
Antiguo 19/09/2010, 07:43
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayudita con esta consulta

En cuanto a la sentencia que se debe usar, si la búsqueda debe hacerse sobre varios campos al mismo tiempo, es mejor primero ver qué campos son los que se usarán para buscar, porque el resultado y la dificultad de crear la sentencia variarán enormemente según el caso:
- Si el dato a buscar es de tipo alfanumérico, por ejemplo, no tiene sentido invocar campos de fecha, numéricos o booleanos. Esto ya nos permite reducir las posibilidades a sólo campos de caracteres, textos o enum.
- Si el tipo de datos es numérico puede que sólo nos interesen los campos numéricos. Pero si ese numero corresponde a cualquier cosa, sólo quedan fuera los booleanos o de fecha.
- Si son de fecha, puede que sólo queden los de fecha, o si la fecha puede estar en un texto, habrá que incluir todos los campos cuya longitud sea mayor o igual a 8 (longitud de una fecha).

Como verás, esto puede implicar que debas crear más de una sentencia a usar, usando aquella que se ajuste mejor a la búsqueda a realizar.
Usar una sola sentencia puede terminar siendo sumamente ineficiente. No existen sentencias genéricas que sean óptimas para ningún tipo de bases de datos. Yo tengo aplicaciones que sólo tienen 12 tablas y usan más de 50 tipos de construcciones de sentencias diferentes, simplemente para consultar los datos de diferentes formas.

Mientras precisa sea la creación de la consulta, incluso si esta es variable, más eficientes se vuelven las consultas.

Finalmente, en cuanto a la sentencia misma, para tu caso no es LIKE lo mejor que puedes usar, sino las búsquedas de texto completo, que te pueden devolver un conjunto de registros donde aparece lo buscado, jerarquizados de mayor relevancia a menor relevancia. Es el caso de las funciones de búsqueda de texto completo (Full-Text), que tiene esta forma:
Cita:
MATCH (col1,col2,...) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION])
que tiene, por ejemplo este uso:

Código MySQL:
Ver original
  1. SELECT * FROM articles
  2. WHERE MATCH (title,body) AGAINST ('database');
En este caso, en MATCH van las columnas contra las que se realizará la busqueda.

Esta forma tiene dos limitaciones:
1) Sólo funciona cuando se crean índices FULLTEXT, por ejemplo:
Código MySQL:
Ver original
  1. mysql> CREATE TABLE articles (
  2.     ->   title VARCHAR(200),
  3.     ->   body TEXT,
  4.     ->   FULLTEXT (title,body);
2) Sólo se pueden crear estos índices en tablas de tipo MyISAM. Las InnoDB no sirven.

Prueba el caso y veremos a partir de allí.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)