MySQL - Busqueda en varias tablas.

 
Vista:

Busqueda en varias tablas.

Publicado por Carlos Inca (1 intervención) el 10/01/2018 15:42:35
Que tal gente, quisiera ver si me pueden ayudar. Soy nuevo en esto xd

Tengo 5 tablas con al rededor de 30 campos cada una, pero a la vez manejan algunos mismos campos que son (DNI, ESTADO, POSICION, NOMBRES, CARGO, CONDICION, INGRESO, SALIDA)

Mi consulta como seria la consulta para hacer una busqueda de esos campos en todas las tablas a la vez porque tengo un formulario con una caja de texto y la idea es poner el nombre y que realize la busqueda en todas las tablas y me muestre esos campos. (Estoy trabajando con MySQL y PHP) .


Gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Busqueda en varias tablas.

Publicado por horacio (3 intervenciones) el 10/01/2018 16:22:15
Si no entendí mal y lo que buscas es coincidencias seria mas o menos asi

"select * from tabla1 as a, tabla2 as b tabla3 as c tabla 4 as d where a.dni= b.dni and a.dni=c.dni and a.dni=d.dni and a.dni =' " & textbox.text & " ' "

así tantos como tablas tengas con el, mismo campo e información.
la commilla simple va entre comillas dobles sin espacios estos solo los puse para que lo veas
esto es mas rápido y mas liviano que si usaras INNER JOIN
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Busqueda en varias tablas.

Publicado por leonardo_josue (414 intervenciones) el 10/01/2018 18:41:45
Hola Carlos...

Si bien entiendo lo que quieres hacer, hay pequeño detalle a considerar que es importante que nos aclares.

Dices que quieres hacer una búsqueda en todas las tablas, pero la duda es si el Dato que quieres buscar TIENE QUE EXISTIR EN TODAS LAS TABLAS para que te arroje un resultado positivo...

Si es así, entonces la propuesta de Horacio es perfectamente válida, supongamos este ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
mysql> select * from tabla1;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | dos         |
|    3 | tres        |
+------+-------------+
3 rows in set (0.00 sec)
 
mysql> select * from tabla2;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    4 | cuatro      |
|    5 | cinco       |
+------+-------------+
3 rows in set (0.00 sec)
 
mysql> select * from tabla3;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    6 | seis        |
|    7 | siete       |
+------+-------------+
3 rows in set (0.00 sec)

Entonces, si buscaramos los registros con descripción UNO, tal como lo comenta Horacio, podríamos hacer algo así:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> select tabla1.*
    -> from tabla1
    -> inner join tabla2 on tabla1.id = tabla2.id
    -> inner join tabla3 on tabla1.id = tabla3.id
    -> where
    ->   tabla1.descripcion = 'uno';
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
+------+-------------+
1 row in set (0.01 sec)

Esto es correcto porque la descripción aparece en las tres tablas. Pero qué pasa si buscamos ahora la descripción DOS:

1
2
3
4
5
6
7
mysql> select tabla1.*
    -> from tabla1
    -> inner join tabla2 on tabla1.id = tabla2.id
    -> inner join tabla3 on tabla1.id = tabla3.id
    -> where
    ->   tabla1.descripcion = 'dos';
Empty set (0.00 sec)

Aquí no se muestra resultado porque la descripción sólo existe en una de las tablas. En este caso, si deseas que la búsqueda te arroje algún resultado, podrías utilizar UNION'S, así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT T.* FROM
    -> (
    ->   SELECT tabla1.* FROM tabla1
    ->   UNION
    ->   SELECT tabla2.* FROM tabla2
    ->   UNION
    ->   SELECT tabla3.* FROM tabla3
    -> ) T
    -> WHERE T.descripcion = 'dos';
+------+-------------+
| id   | descripcion |
+------+-------------+
|    2 | dos         |
+------+-------------+
1 row in set (0.02 sec)

Finalmente, una pregunta para el compañero Horacio, en tus post's nos pones esto:

1
2
3
así tantos como tablas tengas con el, mismo campo e información.
la commilla simple va entre comillas dobles sin espacios estos solo los puse para que lo veas
esto es mas rápido y mas liviano que si usaras INNER JOIN

Hasta donde sé, en MySQL hacer JOIN's implícitos con FROM-WHERE o utilizar JOIN's tienen el mismo performance, sin embargo, en otros manejadores como ORACLE y SQL Server, es más rápido hacer INNER JOIN's en lugar de FROM-WHERE. No sé si tengas alguna referencia que nos puedas compartir para saber si en realidad lo que haces es la propuesta más rápida y liviana para MySQL.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Busqueda en varias tablas.

Publicado por horacio (3 intervenciones) el 11/01/2018 14:00:03
Estimado Leo

fue muy buena tu aclaración por si los datos no se encontraban en todas las tablas, con respecto a la velocidad de respuesta trabajo con
Gambas y mysql en Linux Ubuntu y con sqlserver con .Net y VB6 bajo windows con tablas que superan el millón de registros, no se si esto es mucho o poco para uds. pero e notado que en ambas plataformas el INNER Joins arma primero todas las túplas posibles de resultados y a partir de ahí empieza a hacer los filtros, por el contrario el From-Where arranca filtrando y eso hace que los datos que maneja sean menores desde el principio de la resolución. Quizás con pocos datos no haya diferencias y es mucho mas facil de escribir la sentencia con INNER-JOIN , pero cuando cruzas dos o mas tablas con una cantidad considerable de registros el INNER JOIN lo que hace algebraícamente es el producto cartesiano de todos los campos contra todos de las tablas en cuestión y esa primera parte es la que tiende a hacer pesada en términos de tiempo la consulta. Al menos es la experiencia que yo tengo en los casi 30 años que programo y es lo que me hace escribir los FROM-WHERE aunque es mucho mas tedioso y laborioso .

Saludos Horacio Ferrer
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Busqueda en varias tablas.

Publicado por Leonardo Josué (414 intervenciones) el 11/01/2018 19:35:44
Gracias por el comentario Horacio:

Lamentablemente, no he tenido oportunidad de trabajar con millones de Registros con MySQL, pero si con ORACLE y SQL Server y como te comenté en mi post pasado, ahí si hay diferencias considerables en rendimiento.

Por ponerte un ejemplo, el año pasado me tocó trabajar sobre una BD's de ORACLE con tablas de más de 8 millones de registros. El hacer un SELECT complejo con JOIN's tipo FROM-WHERE, tomaba alrededor de 45 minutos. Cambiando simplemente a INNER JOIN's y agregando las condiciones de filtrado en la cláusula ON, los tiempos se redijeron a poco menos de 16 minutos, es decir, una mejora de más del 60% del tiempo.

Pero es bueno saber que para MySQL, es posible que no se cumpla con este mismo comportamiento, espero tener algún día la oportunidad de hacer mis propias pruebas para comprobar lo que comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar