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

Consulta multiples tablas

Estas en el tema de Consulta multiples tablas en el foro de Mysql en Foros del Web. Hola Gente. le comento que tengo el siguiente problema, tengo 3 trablas. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original CREATE TABLE IF NOT EXISTS `Equip _ ...
  #1 (permalink)  
Antiguo 19/03/2013, 09:41
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 18 años
Puntos: 0
Consulta multiples tablas

Hola Gente.
le comento que tengo el siguiente problema, tengo 3 trablas.

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `Equip_CtrlEquipo` (
  2.   `CtrlEquipo_Id` int(10) NOT NULL auto_increment,
  3.   `CtrlEquipo_InformeN` varchar(255) collate utf8_spanish_ci NOT NULL,
  4.   `CtrlEquipo_Codigo` varchar(255) collate utf8_spanish_ci NOT NULL,
  5.   `CtrlEquipo_FechaCtrl` datetime NOT NULL,
  6.   `CtrlEquipo_TipoCtrl` int(2) NOT NULL,
  7.   `CtrlEquipo_FechaProxCtrl` datetime NOT NULL,
  8.   `CtrlEquipo_RelPor` varchar(255) collate utf8_spanish_ci NOT NULL,
  9.   `CtrlEquipo_Conforme` int(2) NOT NULL,
  10.   `CtrlEquipo_UltimoCtrl` int(2) NOT NULL,
  11.   `CtrlEquipo_UsuarioCrea` varchar(255) collate utf8_spanish_ci NOT NULL,
  12.   `CtrlEquipo_FechaCrea` datetime NOT NULL,
  13.   `CtrlEquipo_Archivo` varchar(255) collate utf8_spanish_ci NOT NULL,
  14.   `CtrlEquipo_Url` varchar(255) collate utf8_spanish_ci NOT NULL,
  15.   PRIMARY KEY  (`CtrlEquipo_Id`)
  16. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
  17.  
  18. CREATE TABLE IF NOT EXISTS `Equip_Equipos` (
  19.   `Equipos_Id` int(10) NOT NULL auto_increment,
  20.   `Equipos_Tipo` int(2) NOT NULL,
  21.   `Equipos_Marca` varchar(255) collate utf8_spanish_ci default NULL,
  22.   `Equipos_Provedor` varchar(255) collate utf8_spanish_ci default NULL,
  23.   `Equipos_FechaRcep` datetime NOT NULL,
  24.   `Equipos_FechaInicio` datetime NOT NULL,
  25.   `Equipos_Codigo` varchar(255) collate utf8_spanish_ci NOT NULL,
  26.   `Equipos_Rango` varchar(255) collate utf8_spanish_ci default NULL,
  27.   `Equipos_Resolucion` varchar(255) collate utf8_spanish_ci default NULL,
  28.   `Equipos_Estado` int(2) NOT NULL,
  29.   `Equipos_FechaEstado` datetime NOT NULL,
  30.   `Equipos_Area` int(2) NOT NULL,
  31.   `Equipos_Observaciones` varchar(255) collate utf8_spanish_ci default NULL,
  32.   `Equipos_ObservacionesEstado` varchar(255) collate utf8_spanish_ci default NULL,
  33.   `Equipos_Despacho` int(2) NOT NULL,
  34.   `Equipos_UsuarioCrea` varchar(50) collate utf8_spanish_ci NOT NULL,
  35.   `Equipos_FechaCrea` datetime NOT NULL,
  36.   `Equipos_UsuarioAct` varchar(50) collate utf8_spanish_ci default NULL,
  37.   `Equipos_FechaAct` datetime default NULL,
  38.   `Equipos_Ubicacion` int(2) NOT NULL,
  39.   `Equipos_Responsable` varchar(255) collate utf8_spanish_ci NOT NULL,
  40.   `Equipos_Valor` int(255) NOT NULL,
  41.   PRIMARY KEY  (`Equipos_Id`)
  42. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
  43.  
  44. CREATE TABLE IF NOT EXISTS `Equip_Ctrl` (
  45.   `Ctrl_Id` int(10) NOT NULL auto_increment,
  46.   `Ctrl_Tipo` int(2) NOT NULL,
  47.   `Ctrl_Codigo` varchar(255) collate utf8_spanish_ci NOT NULL,
  48.   `Ctrl_Periodo` int(2) NOT NULL,
  49.   `Ctrl_Rango` varchar(255) collate utf8_spanish_ci default NULL,
  50.   PRIMARY KEY  (`Ctrl_Id`)
  51. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

La tabla Equip_Equipos Contiene toda la inforacion referente a los equipos, la tabla Equip_Ctrl contiene la informacion asociada alos controles a los cuales esta sometido cada equipo ej: Calibracion, Verificacion o Mantencion, la tabla Equipo_CtrlEquipo tiene toda la informacion sobre los controles ya realizados en los equipos siendo la union entre ellos Codigo.

necesito hacer una consulta la cual me entregue todos los equipos cuyos controles estan no realizados ( es decir aparecen en Equip_Crtl ), pero no en Equip_CtrlEquipo, ademas de todos los equipos los cuales sus controles tienen fecha de la proxima realizacion es menos a la fecha del dia. se entiende???
  #2 (permalink)  
Antiguo 19/03/2013, 11:03
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Consulta multiples tablas

Hola Killerx_8937:

Se entiende lo que quieres obtener, pero no sé qué es lo que intentaste hacer... porque supongo que intentaste hacer algo correcto?, En realidad en tu post no nos hablas de ningún problema que tengas, más bien pareciera una petición para hacer tu trabajo, cosa que no es correcto, ojo con eso.

vayamos por partes y algunos tips. para lo de verificar que un registro exista en una tabla y no en otra puedes hacerlo con LEFT JOIN, con NOT EXISTS o con NOT IN... las tres son válidas.

en cuanto a lo de las fechas, bueno, pareciera que es una comparación simple... trata de obtener las consultas y dinos con qué problemas te enfrentas, postea lo que trataste de hacer y con gusto te ayudamos a resolver cualquier problema.

Saludos
Leo.
  #3 (permalink)  
Antiguo 19/03/2013, 12:03
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 18 años
Puntos: 0
Respuesta: Consulta multiples tablas

Hola Leo.

Primero quisiera deciirte que no soy estudiante, es un proyecto para mi trabajo el cual hago solo de autodidacta te cuento que mi conocimiento no muy extenso, pero e probado lo siguiente
Código MySQL:
Ver original
  1. SELECT * FROM `Equip_Equipos` LEFT JOIN `Equip_CtrlEquipo` USING(Equipos_Codigo)
,

aqui va mi consulta al intentar usar using me di cuenta que los campos relacionados deben tener el mismo nombre o no? en este caso lso campos Equipos_Codigo y CtrlEquipo_Codigo deberian llamarse iguales para poder realizar la consulta, no hay manera de hacer algo como USING(Equipos_Codigo,CtrlEquipo_Codigo), por otra parte me cuesta unpoco estructurar Consulta Completa, tambien probe con natural left join pero me utiliza el id de la tabla para hacer la relacion, no el codigo, creo que probare primero cambiando la estructura de las tablas y dejando el codigo del equipo como primary key, pero me sigue quedando la duda si USING recibe mas de un parametro.

Gracias
  #4 (permalink)  
Antiguo 19/03/2013, 12:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Consulta multiples tablas

USING recibe más de un parámetro, en tanto todos tengan el mismo nombre en ambas tablas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 19/03/2013, 12:28
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Consulta multiples tablas

Hola Killerx_8937:

Vayamos por partes para resolver tus dudas:

Cita:
aqui va mi consulta al intentar usar using me di cuenta que los campos relacionados deben tener el mismo nombre o no?
USING(Equipos_Codigo)

Efectivamente, cuando utilizas USING el campo se debe llamar igual en las dos tablas que intentas unir, (de hecho es una buena práctica de SQL llamara a las llaves foráneas de la misma manera que sus llaves a las que hacen referencia, pero en realidad esas es una forma de ahorrar código... Tu puedes especificar el nombre de tus campos sin ningún problema. Checa este script:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    1 | uno         |
  6. |    2 | dos         |
  7. |    3 | tres        |
  8. +------+-------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tabla2;
  12. +---------+-------------+
  13. | otro_id | descripcion |
  14. +---------+-------------+
  15. |       1 | uno         |
  16. |       2 | two         |
  17. +---------+-------------+
  18. 2 rows in set (0.00 sec)

observa que el campo llave no tiene el mismo nombre, por lo tanto tú puedes hacer la unión especificando los nombres de cada tabla, así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1 LEFT JOIN tabla2 ON tabla1.id = tabla2.otro_id;
  2. +------+-------------+---------+-------------+
  3. | id   | descripcion | otro_id | descripcion |
  4. +------+-------------+---------+-------------+
  5. |    1 | uno         |       1 | uno         |
  6. |    2 | dos         |       2 | two         |
  7. |    3 | tres        |    NULL | NULL        |
  8. +------+-------------+---------+-------------+
  9. 3 rows in set (0.00 sec)

En otras palabras

Código:
USING(Equipos_Codigo)

es una abreviación de 

tabla1.Equipos_Codigo = tabla2.Equipos_Codigo

Por lo tanto, no es indispensable que el campo se llame igual en tus tablas. Ahora bien siguiendo con tu problema. Te comentaba que para saber si un registro esta en una tabla pero no en otra lo podías hacer de tres maneras distintas... Con LEFT JOIN, con NOT EXISTS y con NOT IN. Veamos cada caso...

Supongamos que te interesa saber qué id's de tu tabla1 no están en tu tabla2, podrías hacerlo así:

CON LEFT JOIN:

Código MySQL:
Ver original
  1. mysql> SELECT tabla1.* FROM tabla1
  2.     -> LEFT JOIN tabla2 ON tabla1.id = tabla2.otro_id
  3.     -> WHERE tabla2.otro_id IS NULL;
  4. +------+-------------+
  5. | id   | descripcion |
  6. +------+-------------+
  7. |    3 | tres        |
  8. +------+-------------+
  9. 1 row in set (0.00 sec)

CON NOT IN:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1 WHERE id NOT IN (SELECT otro_id FROM tabla2);
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    3 | tres        |
  6. +------+-------------+
  7. 1 row in set (0.00 sec)

CON NOT EXISTS:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1
  2.     -> WHERE NOT EXISTS (SELECT otro_id FROM tabla2
  3.     ->                   WHERE tabla1.id = tabla2.otro_id);
  4. +------+-------------+
  5. | id   | descripcion |
  6. +------+-------------+
  7. |    3 | tres        |
  8. +------+-------------+
  9. 1 row in set (0.00 sec)

La principal diferencia entre los métodos es la posibilidad de comparar contra más de un campo. NOT IN SÓLO TE PERMITE COMPARAR UN CAMPO A LA VEZ, en este caso el id, pero observa que la descripción de la tabla2 para el id=2 no es la misma... Si quisieras comparar por ambos campos NO PODRÍAS HACERLO CON NOT IN... pero si podrías hacerlo con el LEFT JOIN y con el NOT EXISTS:

CON EL LEFT JOIN:

Código MySQL:
Ver original
  1. mysql> SELECT tabla1.* FROM tabla1
  2.     -> LEFT JOIN tabla2 ON tabla1.id = tabla2.otro_id AND
  3.     ->           tabla1.descripcion = tabla2.descripcion
  4.     -> WHERE tabla2.otro_id IS NULL;
  5. +------+-------------+
  6. | id   | descripcion |
  7. +------+-------------+
  8. |    2 | dos         |
  9. |    3 | tres        |
  10. +------+-------------+
  11. 2 rows in set (0.00 sec)

CON EL NOT EXISTS:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1
  2.     -> WHERE NOT EXISTS (SELECT otro_id FROM tabla2
  3.     ->                   WHERE tabla1.id = tabla2.otro_id AND
  4.     ->                         tabla1.descripcion = tabla2.descripcion);
  5. +------+-------------+
  6. | id   | descripcion |
  7. +------+-------------+
  8. |    2 | dos         |
  9. |    3 | tres        |
  10. +------+-------------+
  11. 2 rows in set (0.00 sec)

Observa que en estos dos casos también se lista el registro (id=2, descripcion='dos') porque en la tabla2 existe el mismo id, PERO NO TIENE LA MISMA DESCRIPCIÓN.

Saludos
Leo.
  #6 (permalink)  
Antiguo 19/03/2013, 13:26
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 18 años
Puntos: 0
Respuesta: Consulta multiples tablas

muchas gracias por la informacion me has motivado a seguir practicando y aprendiendo mas de mysql, comenzare las pruebas y apenas tenga la respuesta la comentare gracias otra vez

Etiquetas: joins
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 08:02.