Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

buscar en varios campos de una misma tabla

Estas en el tema de buscar en varios campos de una misma tabla en el foro de Bases de Datos General en Foros del Web. Necesito que alguien me ayude con una consulta. Lo que deseo realizar es una busqueda de una cadena en varios campos de una misma tabla. ...
  #1 (permalink)  
Antiguo 04/11/2003, 17:29
 
Fecha de Ingreso: noviembre-2003
Ubicación: Cali
Mensajes: 3
Antigüedad: 20 años, 5 meses
Puntos: 0
buscar en varios campos de una misma tabla

Necesito que alguien me ayude con una consulta. Lo que deseo realizar es una busqueda de una cadena en varios campos de una misma tabla. El caso es el sgte:
En los campos en donde voy a buscar son: nombre, apellido1 y apellido2. El valor de la cadena no tiene un orden, pues yo puedo buscar por Juanito Perez o Perez Juanito o Pepe Juanito Perez.... es decir, de varias formas puedo buscar el nombre de una persona q este en la BD.
  #2 (permalink)  
Antiguo 04/11/2003, 23:48
Avatar de BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 22 años, 5 meses
Puntos: 655
No especificas la BD que usas pero como por lo general se pregunta por MySQL, te voy a dar 2 ejemplos.

Ejemplo1: Lo que se hace utilizar la función CONCAT para concatenar los campos como uno solo y luego preguntar si entre toda esa cadena se encuetra Perez. Como se puede ver, se separa cada campo con un blanco.

Código PHP:
SELECT nombreapellido1apellido2 FROM tnombre
WHERE CONCAT
nombre" "apellido1" "apellido2)
LIKE "%Perez%" 
Ejemplo2: Es igual al ejemplo anterior solo que el primer parámetro pasado a la función CONCAT_WS es para indicar el tipo de separador a usar. En este caso es un blanco también.

Código PHP:
SELECT nombreapellido1apellido2 FROM tnombre
WHERE CONCAT_WS
(" "nombreapellido1apellido2)
LIKE "%Perez%" 
Más referencia 6.3.2 String Functions

Nota: Recorda que este ejemplo es para MySQL. Si usas otro motor de BD, tendrías que buscar las funciones de concatenación que utiliza.
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL

Última edición por BrujoNic; 05/11/2003 a las 15:02
  #3 (permalink)  
Antiguo 05/11/2003, 18:56
 
Fecha de Ingreso: noviembre-2003
Ubicación: Cali
Mensajes: 3
Antigüedad: 20 años, 5 meses
Puntos: 0
consulta de varias cadenas en varios campos de una tabla

Gracias por tu aporte. Yo estoy haciendo la prueba con la BD MySQL. Hice la consulta que enviaste y me funciono, pero no me arroja el resultado esperado, ya que necesito poder comparar no solo con una cadena sino con varias... El caso es que se ingresa, bien sea el primer apellido junto con el nombre o el primer y segundo apellido, en fin varias combinaciones del nombre de la persona y que esas cadenas las pueda buscar en los tres campos donde se encuentra almacena esa información.

Yo intente lo sgte (añadiendole a lo q tu me dijiste):
SELECT nombre, apellido1, apellido2 FROM tnombre
WHERE CONCAT( nombre, " ", apellido1, " ", apellido2)
LIKE "%Perez%" + "%Juanito%" + "%Lopez%";

Pero no me dio el resultado deseado, ya que muestra todas las personas que tengan la cadena Perez sin importar el resto... no tiene encuenta las demas cadenas! Supongamos q en la BD tengo el registro de las personas Juan Juanito Perez Lopez y otro llamado Juanito Perez Campos. Segun los criterios de busqueda, necesito que la consulta arroje los datos de la primera persona, q son los que coinciden con las tres cadenas; pero con esa consulta me arroja todos los q coincidan con Perez solamente :( Ojala me puedas dar una manita con esa consulta!!
  #4 (permalink)  
Antiguo 06/11/2003, 03:05
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 707
Antigüedad: 21 años
Puntos: 0
Tal y como has puesto la select, se debe de dar las ocurrencias en el mismo orden, por eso puede que no te salgan, teniendo en cuenta lo que dices, deberías poner algo así, aunque sea lento

SELECT nombre, apellido1, apellido2 FROM tnombre
WHERE CONCAT( nombre, " ", apellido1, " ", apellido2)
LIKE "%Perez%" AND CONCAT( nombre, " ", apellido1, " ", apellido2)
LIKE "%Juanito%" AND CONCAT( nombre, " ", apellido1, " ", apellido2)
LIKE "%Lopez%";

Creo que esto debería funcionar

Un saludo
  #5 (permalink)  
Antiguo 06/11/2003, 09:06
Avatar de BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 22 años, 5 meses
Puntos: 655
Al principio de tu mensaje interpreté que el valor a buscar te lo daban en cualquier orden y en una sola hilera, No en 3 y cualquiera pudiera ir sin valores. Ahora tengo más claro lo que necesitas.

Intenta la opción de Teri. Si no te funciona, te dejo otra forma la cual creo que puede funcionarte y lo encontre en el manual de MySQL 6.3.1.4 Control Flow Functions. Es usando un IF. Donde tengo dudas es que ahi lo usan dentro del SELECT y NO dentro de un WHERE. Además, te dejo la referencia de otras funciones que vamos a emplear 6.3.2 String Functions

Código PHP:
SELECT nombreapellido1apellido2 FROM tnombre
WHERE
nombre LIKE CONCAT
("%"TRIM(IF(LENGTH(TRIM($nomb)) > 0$nombnombre)), "%") AND
apellido1 LIKE CONCAT("%"TRIM(IF(LENGTH(TRIM($apel1)) > 0$apel1apellido1)), "%") AND
apellido2 LIKE CONCAT("%"TRIM(IF(LENGTH(TRIM($apel2)) > 0$apel2apellido2)), "%"
Voy a tratar de explicar un poco el funcionamiento de este SELECT más que todo en la parte del WHERE.

Primero que todo, voy a suponer que estas usando PHP para desarrollar por lo que vamos a usar 3 variables $nomb, $apel1 y $apel2. Antes de realizar el SELECT, debes asegurarte cuales variables estan en nulo y moverles un blanco " ".

Ahora lo que se va a hacer es evaluar cada condición, ejemplo:
nombre LIKE CONCAT("%", TRIM(IF(LENGTH(TRIM($nomb)) > 0, $nomb, nombre)), "%").

El CONCAT lo que va a hacer es poner %resultado%, o sea, los signos de "%" al principio y al final.

El TRIM va a quitar TODOS los espacios o blancos a la izquierda y derecha.

El IF funciona así IF(1>0, "VERDADERO", "FALSO) si uno es mayor a cero, el resultado va a ser la literal "VERDADERO", en caso contrario, "FALSO".

El LENGTH, verifica si la hilera o variable no esté vacia quitando primero los blancos con TRIM. Si el resultado del IF es mayor a cero, evalúa lo que trae la variable, en caso ser cero, deja el contenido del campo nombre. ¿Porqué se hace así? Esto es para que si se dejan en blanco todos los valores introducidos por el usuario, muestre todo el contenido de la tabla. En caso de introducir algún valor en alguno de los campos, evalúa la variable o variables introducida y donde no se puso nada, evalua el contendio del campo dentro de la tabla.

Bueno, fue mucha explicación la cual espero sea clara y funcione.
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #6 (permalink)  
Antiguo 08/11/2003, 19:58
 
Fecha de Ingreso: noviembre-2003
Ubicación: Cali
Mensajes: 3
Antigüedad: 20 años, 5 meses
Puntos: 0
Gracias a Teri y a BrujoNic por su colaboración... Probe la consulta de Teri y me funcione bien...

Saludos.!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 12:14.