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

busqueda de un valor en varios campos

Estas en el tema de busqueda de un valor en varios campos en el foro de Mysql en Foros del Web. Buenos días, quisiera sacarme una duda, tengo una consulta asi: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original select id , nombre , prod1 , prod2 , ...
  #1 (permalink)  
Antiguo 19/01/2015, 08:09
 
Fecha de Ingreso: abril-2011
Mensajes: 171
Antigüedad: 13 años, 7 meses
Puntos: 1
busqueda de un valor en varios campos

Buenos días, quisiera sacarme una duda, tengo una consulta asi:
Código MySQL:
Ver original
  1. select id,nombre,prod1,prod2,prod3 from cliente where prod1=3 or prod2=3 or prod3=3
quisiera saber si esa consulta se puede hacer de alguna forma parecida a la siguiente:
Código MySQL:
Ver original
  1. select id,nombre,prod1,prod2,prod3 from cliente where prod1,prod2,prod3=3
la consulta de esta menera es incorrecta, pero hay alguna forma de buscar un valor en varios campos distintos de una tabla sin tener que repetir el valor a buscar??
  #2 (permalink)  
Antiguo 19/01/2015, 08:32
 
Fecha de Ingreso: octubre-2014
Ubicación: Buenos Aires
Mensajes: 278
Antigüedad: 10 años, 1 mes
Puntos: 12
Respuesta: busqueda de un valor en varios campos

Hola axelb, podrías hacer algo así.

Código MySQL:
Ver original
  1.    id_nombre, campo1, campo2, campo3
  2.    cliente
  3.     CONCAT(campo1, ' ', campo2, ' ', campo3) LIKE '%$valor%'

espero te sirva.

Saludos.
__________________
http://www.sp-vision.net
  #3 (permalink)  
Antiguo 19/01/2015, 08:44
 
Fecha de Ingreso: abril-2011
Mensajes: 171
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: busqueda de un valor en varios campos

lo he probado, pero solo me devuelve los registros que contienen el valor buscado en el primer campo que aparece en el CONCAT, que sera campo1
  #4 (permalink)  
Antiguo 19/01/2015, 08:48
 
Fecha de Ingreso: abril-2011
Mensajes: 171
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: busqueda de un valor en varios campos

perdón, no vi los símbolos de porcentaje en el LIKE, lo he probado y parece funcionar, gracias!!
  #5 (permalink)  
Antiguo 19/01/2015, 11:48
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: busqueda de un valor en varios campos

Hola axelb:

Aquí habría que hacer una reflexión... ¿qué problema te implica el que tengas tres veces repetido el valor a buscar? ¿cuál es la razón por la que tienes que hacer esto?

Si piensas que estás siendo "redundante" y que al evitarlo estás optimizando la consulta, temo decirte que estás muy equivocado.

La solución que presenta mauritosuarez, si bien resuelve la cuestión, tiene un pésimo rendimiento, por lo que el performance de tu servidor se puede ver comprometido. Las funciones CONCAT y sobre todo las comparaciones tipo LIKE, DEBES EVITARLAS EN LA MEDIDA DE LO POSIBLE, es mejor hacer las comparaciones tal como lo haces al inicio.

Además, puedo pensar que tu campo es de tipo Numérico (al menos así lo parece), las funciones LIKE y CONCAT se aplican sobre campos tipo caracter, por lo tanto, al utilizarlas, el DBMS tiene que hacer una conversión implícita, para poder aplicar estas funciones, lo que invariablemente afectará en el rendimiento de la consulta y peor aun, puede ocasionarte problemas futuros derivados de estas conversiones.

Insisto, debes tener una verdadera razón de peso para hacer lo que quieres. como dice el dicho: "Hay muchas formas de matar una mosca, pero utilizar una pistola es demasiado".

Saludos
Leo.
  #6 (permalink)  
Antiguo 19/01/2015, 15:22
 
Fecha de Ingreso: abril-2011
Mensajes: 171
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: busqueda de un valor en varios campos

Hola leonardo_josue, entonces dices que debería dejarla así como al principio?? Debería de haber alguna forma mas sencilla de hacerlo, o de verdad que no lo hay?? simplemente una forma reducida de hacerlo!!
  #7 (permalink)  
Antiguo 19/01/2015, 16:02
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: busqueda de un valor en varios campos

Hola de Nuevo axelb:

La única forma de "reducir" la consulta, sería utilizar un IN en lugar de varios OR, sin embargo, no por el hecho de hacer que la consulta sea más pequeña significa que sea mejor... para "simplificar" la consulta podrías hacer lo siguiente:

Código MySQL:
Ver original
  1. SELECT id, nombre, prod1, prod2, prod3
  2. FROM cliente
  3. WHERE 3 IN (prod1, prod2, prod3);

Esta es una versión reducida del OR, sin embargo, tengo que reconocer que nunca lo he utilizado de esta forma...

Es posible que si tienes pocos registros en tu tabla no veas diferencias significativas en las consultas, pero de cualquier manera sería conveniente que hagas un monitoreo de las mismas para ver cuál es la mejor... puedes hacer uso de funciones como EXPLAIN para ver las sugerencias que te hace el mismo DBMS acerca de la optimización de las consultas... prueba todas, desde la original, la que propone mauritosuarez o esta última con el IN y dinos cuál tiene mejor rendimiento.

Saludos
Leo.
  #8 (permalink)  
Antiguo 19/01/2015, 16:12
 
Fecha de Ingreso: abril-2011
Mensajes: 171
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: busqueda de un valor en varios campos

lo he hecho con las 3 formas y en todos los casos el resultado es este:

1, 'SIMPLE', 'proveedores', 'ALL', '', '', '', '', 163, 'Using where'
  #9 (permalink)  
Antiguo 20/01/2015, 11:10
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: busqueda de un valor en varios campos

Hola de nuevo axelb:

tal como te comentaba en el último post: es posible que con pocos registros no haya mucha diferencia entre las consultas...

Si el resultado del EXPLAIN es el mismo entonces checa simplemente el tiempo de ejecución de cada consulta... Si también el tiempo es el mismo, entonces te darás cuenta de que no era necesario hacer ninguna "mejora" a la consulta

Saludos
Leo.
  #10 (permalink)  
Antiguo 20/01/2015, 12:30
 
Fecha de Ingreso: abril-2011
Mensajes: 171
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: busqueda de un valor en varios campos

Tal cual, lo que me preocupaba un poco es el resultado del type: ALL, pero la verdad que no se exactamente que quiere decir, pero según lo poco que he leído, pude entender que no es muy bueno...
  #11 (permalink)  
Antiguo 20/01/2015, 14:27
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: busqueda de un valor en varios campos

Hola de nuevo axelb:

Cita:
Tal cual, lo que me preocupaba un poco es el resultado del type: ALL, pero la verdad que no se exactamente que quiere decir, pero según lo poco que he leído, pude entender que no es muy bueno...
El que el resultado del EXPLAIN sea un tipo ALL significa que la búsqueda se hace de manera exhaustiva entre todos los registros de tu tabla... esto parece indicar que no estás manejando correctamente los índices en tu tabla.

Si quieres optimizar la consulta, en lugar de tratar de "simplificar" la sentencia, debes tener un correcto manejo de tus índices. Te sugiero que además de tu llave principal, (que puedo suponer que es el campo id), manejes como índice también los campos que intervienen en el WHERE, es decir los campos prod1, prod2 y prod3.

Esto si puede hacer más rápida la consulta.

Saludos
Leo
  #12 (permalink)  
Antiguo 20/01/2015, 15:34
 
Fecha de Ingreso: abril-2011
Mensajes: 171
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: busqueda de un valor en varios campos

Lo tendré en cuenta, de todas formas al final cambie el diseño de la base, así podría hacer la consulta mas optima! De todas formas muchas gracias por su ayuda! Saludos

Etiquetas: busqueda, campo, campos, select, tabla, valor
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




La zona horaria es GMT -6. Ahora son las 13:43.