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

Consulta en dos tablas

Estas en el tema de Consulta en dos tablas en el foro de Mysql en Foros del Web. Estimados. nuevamente debo resurrir a su experiencia e ingenio les cuento tengo 2 tablas. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original CREATE TABLE IF NOT EXISTS ...
  #1 (permalink)  
Antiguo 19/07/2012, 08:22
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Consulta en dos tablas

Estimados.

nuevamente debo resurrir a su experiencia e ingenio les cuento tengo 2 tablas.


Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `Equip_Equipos` (
  2.   `Equipos_Id` int(10) NOT NULL auto_increment,
  3.   `Equipos_Tipo` int(2) NOT NULL,
  4.   `Equipos_Marca` varchar(255) collate utf8_spanish_ci default NULL,
  5.   `Equipos_Provedor` varchar(255) collate utf8_spanish_ci default NULL,
  6.   `Equipos_FechaRcep` datetime NOT NULL,
  7.   `Equipos_FechaInicio` datetime NOT NULL,
  8.   `Equipos_Codigo` varchar(255) collate utf8_spanish_ci NOT NULL,
  9.   `Equipos_Rango` varchar(255) collate utf8_spanish_ci default NULL,
  10.   `Equipos_Resolucion` varchar(255) collate utf8_spanish_ci default NULL,
  11.   `Equipos_Estado` int(2) NOT NULL,
  12.   `Equipos_FechaEstado` datetime NOT NULL,
  13.   `Equipos_Area` int(2) NOT NULL,
  14.   `Equipos_Observaciones` varchar(255) collate utf8_spanish_ci default NULL,
  15.   `Equipos_ObservacionesEstado` varchar(255) collate utf8_spanish_ci default NULL,
  16.   `Equipos_Despacho` int(2) NOT NULL,
  17.   `Equipos_UsuarioCrea` varchar(50) collate utf8_spanish_ci NOT NULL,
  18.   `Equipos_FechaCrea` datetime NOT NULL,
  19.   `Equipos_UsuarioAct` varchar(50) collate utf8_spanish_ci default NULL,
  20.   `Equipos_FechaAct` datetime default NULL,
  21.   `Equipos_Ubicacion` int(2) NOT NULL,
  22.   `Equipos_Responsable` varchar(255) collate utf8_spanish_ci NOT NULL,
  23.   PRIMARY KEY  (`Equipos_Id`)
  24. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci AUTO_INCREMENT=6 ;
  25.  
  26.  
  27. INSERT INTO `Equip_Equipos` (`Equipos_Id`, `Equipos_Tipo`, `Equipos_Marca`, `Equipos_Provedor`, `Equipos_FechaRcep`, `Equipos_FechaInicio`, `Equipos_Codigo`, `Equipos_Rango`, `Equipos_Resolucion`, `Equipos_Estado`, `Equipos_FechaEstado`, `Equipos_Area`, `Equipos_Observaciones`, `Equipos_ObservacionesEstado`, `Equipos_Despacho`, `Equipos_UsuarioCrea`, `Equipos_FechaCrea`, `Equipos_UsuarioAct`, `Equipos_FechaAct`, `Equipos_Ubicacion`, `Equipos_Responsable`) VALUES
  28. (1, 12, 'Hevisa', 'Hevisa', '2012-07-18 00:00:00', '2012-07-18 00:00:00', 'S31', '0-3000 g', '0,01 g', 1, '2012-07-18 12:07:02', 1, 'Balanza Covery', '', 2, 'patricio', '2012-07-18 12:07:02', 'patricio', '2012-07-18 12:07:02', 1, 'Jefe Sala Ensayo'),
  29. (2, 12, 'Covery', 'Covery', '2012-07-17 00:00:00', '2012-07-17 00:00:00', 'S30', '0-3000 g', '0,01 g', 1, '2012-07-18 15:07:04', 1, '', '', 2, 'patricio', '2012-07-18 15:07:04', 'patricio', '2012-07-18 15:07:04', 1, 'Jefe Sala Ensayo'),
  30. (3, 16, 'Hevisa', 'Hevisa', '2012-07-18 00:00:00', '2012-07-11 00:00:00', 'S101', '0-50', '0.01"', 1, '2012-07-18 16:07:46', 1, '', '', 2, 'patricio', '2012-07-18 16:07:46', 'patricio', '2012-07-18 16:07:46', 1, 'Jefe Sala Ensayo'),
  31. (4, 2, 'Hevisa', 'Hevisa', '2012-07-17 00:00:00', '2012-07-17 00:00:00', 'S115', '0-3000 g', '0,01 g', 1, '2012-07-18 16:07:52', 1, '', '', 2, 'patricio', '2012-07-18 16:07:52', 'patricio', '2012-07-18 16:07:52', 1, 'Jefe Sala Ensayo'),
  32. (5, 9, 'Hevisa', 'Hevisa', '2012-07-18 00:00:00', '2012-07-18 00:00:00', 'S46', '0-3000 g', '0,01 g', 1, '2012-07-18 16:07:51', 1, '', '', 2, 'patricio', '2012-07-18 16:07:51', 'patricio', '2012-07-18 16:07:51', 1, 'Jefe Sala Ensayo');

y La segunda

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `Equip_Ctrl` (
  2.   `Ctrl_Id` int(10) NOT NULL auto_increment,
  3.   `Ctrl_Tipo` int(2) NOT NULL,
  4.   `Ctrl_Codigo` varchar(255) collate utf8_spanish_ci NOT NULL,
  5.   `Ctrl_Periodo` int(2) NOT NULL,
  6.   `Ctrl_Rango` varchar(255) collate utf8_spanish_ci default NULL,
  7.   PRIMARY KEY  (`Ctrl_Id`)
  8. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci AUTO_INCREMENT=10 ;
  9.  
  10.  
  11. INSERT INTO `Equip_Ctrl` (`Ctrl_Id`, `Ctrl_Tipo`, `Ctrl_Codigo`, `Ctrl_Periodo`, `Ctrl_Rango`) VALUES
  12. (1, 1, 'S31', 4, '10g.20g.50g.100g.200g.500g.1000g.2000g.3000g.'),
  13. (2, 2, 'S31', 3, '500g.'),
  14. (3, 3, 'S31', 4, NULL),
  15. (4, 1, 'S30', 4, '500g.'),
  16. (5, 2, 'S30', 3, '500g.'),
  17. (6, 3, 'S30', 4, NULL),
  18. (7, 1, 'S101', 4, '500g'),
  19. (8, 2, 'S115', 3, '200g.'),
  20. (9, 3, 'S46', 4, NULL);

y pretendo hacer una busqueda que me muestre la informacion del equipo descrito en la primera tabla pero cuando cumpla con requisitos de la seguna ejemplo

que me muestre todos los equipos que posean Ctrl_Tipo 1, 2 y 3. se entiende ahora la consulta que tengo.


Código MySQL:
Ver original
  1. SELECT * FROM Equip_Equipos AS A INNER JOIN Equip_Ctrl AS B ON A.Equipos_Codigo=B.Ctrl_Codigo WHERE B.Ctrl_Tipo ='1' OR B.Ctrl_Tipo ='2' OR B.Ctrl_Tipo ='3' GROUP BY A.Equipos_Codigo

pero me devuelve todos los registros de la tabla uno, sin embargo cuando lo hago con un solo control funciona

Código MySQL:
Ver original
  1. SELECT * FROM Equip_Equipos AS A INNER JOIN Equip_Ctrl AS B ON A.Equipos_Codigo=B.Ctrl_Codigo WHERE B.Ctrl_Tipo ='1' GROUP BY A.Equipos_Codigo
..

Ideas?
  #2 (permalink)  
Antiguo 19/07/2012, 08:24
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta en dos tablas

No sé si te he entendido bien. Si quieres que cumpla las tres condiciones para el mismo, debes hacerlo con OR (puedes usar IN para hacer más simple la sintaxis), count y having

Sería algo así con tus datos:
Código MySQL:
Ver original
  1. SELECT A.Equipos_Codigo, COUNT(distinct B.Ctrl_Tipo) num
  2.  FROM Equip_Equipos AS A
  3.  INNER JOIN Equip_Ctrl AS B
  4.  ON A.Equipos_Codigo=B.Ctrl_Codigo
  5.  WHERE B.Ctrl_Tipo IN (1,2,3)
  6.  GROUP BY A.Equipos_Codigo
  7.  HAVING num > 2
El resultado de esa consulta es S30 y S31.


He editado para corregir algunos errores míos. Creo que es eso lo que buscas.

Última edición por jurena; 19/07/2012 a las 08:45
  #3 (permalink)  
Antiguo 19/07/2012, 10:19
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Consulta en dos tablas

Gracias jurena

Si En parte es lo que quiero, muchas gracias me podrias explicar el uso del count y el having para poder construir las consultas.

te explico, no todos los equipos tienen los 3 controles, por eso desearia hacer la consulta con todas las posibilidades entre los 3 tipos, me explico?.


posibilidades:

solo 1
solo 2
solo 3
1,2,3
2,3
1,3

estas consultas se crean de acuerdo a la seleccion de un formulario en consecuencia la consulta para tipo 1,2,3 seria

Código MySQL:
Ver original
  1. SELECT A.Equipos_Codigo, COUNT( DISTINCT B.Ctrl_Tipo ) num
  2. FROM Equip_Equipos AS A
  3. INNER JOIN Equip_Ctrl AS B ON A.Equipos_Codigo = B.Ctrl_Codigo
  4. WHERE B.Ctrl_Tipo
  5. IN ( 1, 2, 3 )
  6. GROUP BY A.Equipos_Codigo
  7. HAVING num >2

para solo uno seria
Código MySQL:
Ver original
  1. SELECT A.Equipos_Codigo, COUNT( DISTINCT B.Ctrl_Tipo ) num
  2. FROM Equip_Equipos AS A
  3. INNER JOIN Equip_Ctrl AS B ON A.Equipos_Codigo = B.Ctrl_Codigo
  4. WHERE B.Ctrl_Tipo
  5. IN ( 1 )
  6. GROUP BY A.Equipos_Codigo
  7. HAVING num >0

pero para uno y dos? ó 1 y 3?, me entiendes?
  #4 (permalink)  
Antiguo 19/07/2012, 10:34
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta en dos tablas

Sobre el count y el having
Observa lo que tienes en tu segunda tabla, y verás que resulta imposible localizar los que cumplen los tres sin usar una búsqueda con OR (IN para simplificar), que te traería los tres, y un agrupado para contar. Al agrupar por el campo Equipos_Codigo y realizar la búsqueda con OR puedes sacar el total con COUNT, pero para evitar errores debes indicar que sean distintos. El filtro es obligado hacerlo con HAVING, pues el filtro con WHERE es previo al agrupado y el HAVING posterior. Es fácil comparar luego con el alias del COUNT (distinct B.Ctrl_Tipo).

No conozco el rango de opciones, es decir, si hay más valores que 1, 2, 3; si no los hay el selector debería tener los distintos valores, un posible selector sería este
1 control: 1
1 control: 2
1 control: 3
2 controles: 1, 2
2 controles: 1, 3
2 controles: 2, 3
3 controles: 1, 2, 3

el value sería la cadena de texto con los valores, y con esa cadena podrías sacar mediante programación el número para el having, aunque también podría ir en el value:
1-1
1-2
1-3
2-1,2
2-1,3
2-2,3
3-1,2,3

Ahora podrías separar fácilmente los datos para añadirlos en tu consulta.

También podrías hacerlo con un selector con javascript, primero el número de controles
1
2
3
Y luego, según elijas, te mostrará el número de inputs apropiados para cargar las variables.
Pero estas, como otras también pertinentes al caso, no son cuestiones de MySQL y deberías preguntarlas en otros foros PHP, HTML y javascript

En cualquier caso y por lo que se refiere a la base, piensa que tras IN y entre paréntesis añades la cadena de los valores elegidos, y el valor tras el having > siempre será uno menos que el número de controles. Sí podría añadir que si quieres más exactitud uses no having > un número menos, sino HAVING = número exacto
HAVING = 3
en el caso del ejemplo.

Aquí no podemos decirte más sin transgredir las normas del foro.

Última edición por jurena; 19/07/2012 a las 11:07
  #5 (permalink)  
Antiguo 19/07/2012, 14:34
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Consulta en dos tablas

Muchas Gracias Lo resolvi asi gracias a su ayuda

para el control numero solo 1 solo 2 y solo 3
solo cambio IN (1) por el control respectivo

Código MySQL:
Ver original
  1. SELECT A.Equipos_Codigo,A.Equipos_Tipo,A.Equipos_Marca,A.Equipos_Rango,A.Equipos_Resolucion,A.Equipos_Area, COUNT( DISTINCT B.Ctrl_Tipo ) num FROM Equip_Equipos AS A INNER JOIN Equip_Ctrl AS B ON A.Equipos_Codigo = B.Ctrl_Codigo WHERE B.Ctrl_Tipo IN (1) GROUP BY A.Equipos_Codigo HAVING num >0

para la combinacion de 2 controles asi:

IN (2,3) ó IN (1,3)

Código MySQL:
Ver original
  1. SELECT A.Equipos_Codigo,A.Equipos_Tipo,A.Equipos_Marca,A.Equipos_Rango,A.Equipos_Resolucion,A.Equipos_Area, COUNT( DISTINCT B.Ctrl_Tipo ) num FROM Equip_Equipos AS A INNER JOIN Equip_Ctrl AS B ON A.Equipos_Codigo = B.Ctrl_Codigo WHERE B.Ctrl_Tipo IN (1,2) GROUP BY A.Equipos_Codigo HAVING num >1

y para los tres controles como ya me habeis indicado:

Código MySQL:
Ver original
  1. SELECT A.Equipos_Codigo,A.Equipos_Tipo,A.Equipos_Marca,A.Equipos_Rango,A.Equipos_Resolucion,A.Equipos_Area, COUNT( DISTINCT B.Ctrl_Tipo ) num FROM Equip_Equipos AS A INNER JOIN Equip_Ctrl AS B ON A.Equipos_Codigo = B.Ctrl_Codigo WHERE B.Ctrl_Tipo IN (1,2,3) GROUP BY A.Equipos_Codigo HAVING num >2

Ahora no se si fue lo mejor diseñar asi las tablas de la base de datos

El tema de fondo es que no todos los equipos tienen los tres tipos controles, por eso decidí separar en 2 tablas para no dejar campos en blanco en la tabla Equip_Equipos por eso cree una tabala Equip_Ctrl donde se guardan los controles efectivos para cada equipo, pero se me a complicado a la hora de las consultas, jajajaj
  #6 (permalink)  
Antiguo 19/07/2012, 15:04
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta en dos tablas

Killerx_8937, aun sin conocer la lógica de negocio ni los detalles de la estructura de tu base y las relaciones, me parece que ese es el modo correcto de diseñar las tablas por lo que se refiere a los controles. El problema es que esta consulta en concreto suele resultar poco comprensible en general, y hace dudar a la gente sobre el diseño de su base, aun siendo correcto, como creo que es el caso.
  #7 (permalink)  
Antiguo 19/07/2012, 20:54
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Consulta en dos tablas

Muchas Gracias Jurena, siempre es bueno contar con gente como tu, la cual comparte su conocimiento y experiencia. gracias de nuevo.

Etiquetas: join, registros, select, tabla, tablas, tipo
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 07:15.