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

[SOLUCIONADO] Group by SUBCONSULTA

Estas en el tema de Group by SUBCONSULTA en el foro de Mysql en Foros del Web. Como puedo agrupar todos estos datos por nombre de laboratorio. He aquí la forma en la que lo vengo haciendo. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver ...
  #1 (permalink)  
Antiguo 16/07/2013, 11:58
Avatar de AnGuisi  
Fecha de Ingreso: julio-2013
Ubicación: San Felipe - Yaracuy
Mensajes: 122
Antigüedad: 10 años, 9 meses
Puntos: 2
Group by SUBCONSULTA

Como puedo agrupar todos estos datos por nombre de laboratorio. He aquí la forma en la que lo vengo haciendo.

Código MySQL:
Ver original
  1. SELECT estudiante.nombre, estudiante.expediente,estudiante.correo_electronico, horario.turno,
  2. laboratorio.nombre FROM estudiante,horario,laboratorio WHERE
  3. (estudiante.idestudiante,horario.idhorario,laboratorio.idlaboratorio) IN (SELECT
  4. estudiante_laboratio_horario.idestudiante, estudiante_laboratio_horario.idhorario,
  5. estudiante_laboratio_horario.idhorario FROM estudiante_laboratio_horario WHERE
  6. estudiante_laboratio_horario.idlaboratorio IN ('1','2','5')) group by laboratorio.nombre;
El problema es que me esta mostrando solo 1 registro por laboratorio y tengo mas de 1 registro por cada laboratorio. Solo me muestra el primero. Agradecería ayuda.

Última edición por gnzsoloyo; 16/07/2013 a las 12:45
  #2 (permalink)  
Antiguo 16/07/2013, 12:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Group by SUBCONSULTA

Por lo pronto, estás haciendo un JOIN implícito, donde MySQL intentará igualar los campos que tengan el mismo nombre entre las tablas, y dependiendo de sus nombres, puede estar cruzando cosas que no estén realmente relacionadas.
Por ejemplo, puede estar haciendo JOIN entre el nombre del alumno y el nombre del laboratorio, y eso no lo podemos saber sin concer la estructura de la tabla.
Necesitaríamos más claridad acerca de la estructura de la tabla, y te recomiendo no usar JOIN implícito, sino explícito.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 16/07/2013, 13:44
Avatar de AnGuisi  
Fecha de Ingreso: julio-2013
Ubicación: San Felipe - Yaracuy
Mensajes: 122
Antigüedad: 10 años, 9 meses
Puntos: 2
Respuesta: Group by SUBCONSULTA

Esta es la estructura de la base de datos.

Código MySQL:
Ver original
  1. -- Estructura de tabla para la tabla `beca`
  2. --
  3.  
  4. CREATE TABLE `beca` (
  5.   `nrobeca` int(11) NOT NULL DEFAULT '0',
  6.   `tipo` varchar(45) DEFAULT NULL,
  7.   `descripción` varchar(45) DEFAULT NULL,
  8.   PRIMARY KEY (`nrobeca`)
  9. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  10.  
  11. --
  12. -- Volcar la base de datos para la tabla `beca`
  13. --
  14.  
  15. INSERT INTO `beca` VALUES (1, 'Completa', '1250.00 Bs');
  16. INSERT INTO `beca` VALUES (2, 'Media', '625.00 BS');
  17.  
  18. -- --------------------------------------------------------
  19.  
  20. --
  21. -- Estructura de tabla para la tabla `estudiante`
  22. --
  23.  
  24. CREATE TABLE `estudiante` (
  25.   `idestudiante` int(11) NOT NULL,
  26.   `nrobeca` int(11) NOT NULL,
  27.   `expediente` varchar(45) DEFAULT NULL,
  28.   `correo_electronico` varchar(50) DEFAULT NULL,
  29.   `nombre` varchar(45) NOT NULL,
  30.   PRIMARY KEY (`idestudiante`),
  31.   KEY `nrobeca` (`nrobeca`)
  32. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  33.  
  34. --
  35. -- Volcar la base de datos para la tabla `estudiante`
  36. --
  37.  
  38. INSERT INTO `estudiante` VALUES (1, 1, '26633', '[email protected]', 'Gleycer Parra');
  39. INSERT INTO `estudiante` VALUES (2, 1, '26644', '[email protected]', 'Leonardo Padilla');
  40. INSERT INTO `estudiante` VALUES (3, 2, '27952', '[email protected]', 'Marco Serradas');
  41. INSERT INTO `estudiante` VALUES (4, 1, '27958', '[email protected]', 'Jhonnathan Valera');
  42. INSERT INTO `estudiante` VALUES (5, 2, '29888', '[email protected]', 'Kenderbeth López');
  43.  
  44. -- --------------------------------------------------------
  45.  
  46. --
  47. -- Estructura de tabla para la tabla `estudiante_laboratio_horario`
  48. --
  49.  
  50. CREATE TABLE `estudiante_laboratio_horario` (
  51.   `idlaboratorio` int(11) NOT NULL,
  52.   `idhorario` int(11) DEFAULT NULL,
  53.   `idestudiante` int(11) NOT NULL,
  54.   `lapso_académico` varchar(45) DEFAULT NULL,
  55.   KEY `idestudiante` (`idestudiante`),
  56.   KEY `idlaboratorio` (`idlaboratorio`),
  57.   KEY `idhorario` (`idhorario`)
  58. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  59.  
  60. --
  61. -- Volcar la base de datos para la tabla `estudiante_laboratio_horario`
  62. --
  63.  
  64. INSERT INTO `estudiante_laboratio_horario` VALUES (2, 1, 1, '1');
  65. INSERT INTO `estudiante_laboratio_horario` VALUES (2, 1, 2, '1');
  66. INSERT INTO `estudiante_laboratio_horario` VALUES (5, 2, 3, '1');
  67. INSERT INTO `estudiante_laboratio_horario` VALUES (5, 3, 4, '1');
  68. INSERT INTO `estudiante_laboratio_horario` VALUES (1, 0, 5, '1');
  69.  
  70. -- --------------------------------------------------------
  71.  
  72. --
  73. -- Estructura de tabla para la tabla `horario`
  74. --
  75.  
  76. CREATE TABLE `horario` (
  77.   `idhorario` int(11) NOT NULL,
  78.   `turno` varchar(45) DEFAULT NULL,
  79.   PRIMARY KEY (`idhorario`)
  80. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  81.  
  82. --
  83. -- Volcar la base de datos para la tabla `horario`
  84. --
  85.  
  86. INSERT INTO `horario` VALUES (1, 'Mañana');
  87. INSERT INTO `horario` VALUES (2, 'Tarde');
  88. INSERT INTO `horario` VALUES (3, 'Noche');
  89.  
  90. -- --------------------------------------------------------
  91.  
  92. --
  93. -- Estructura de tabla para la tabla `laboratorio`
  94. --
  95.  
  96. CREATE TABLE `laboratorio` (
  97.   `idlaboratorio` int(11) NOT NULL,
  98.   `ubicación` varchar(45) DEFAULT NULL,
  99.   `nombre` varchar(45) DEFAULT NULL,
  100.   `cantidad_equipos` varchar(45) DEFAULT NULL,
  101.   PRIMARY KEY (`idlaboratorio`)
  102. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  103.  
  104. --
  105. -- Volcar la base de datos para la tabla `laboratorio`
  106. --
  107.  
  108. INSERT INTO `laboratorio` VALUES (1, 'Aula C7', 'Alma Mater', '15');
  109. INSERT INTO `laboratorio` VALUES (2, 'Aula A04', 'Moises Sanchez Leal', '18');
  110. INSERT INTO `laboratorio` VALUES (3, 'Aula A03', 'OPSU', '15');
  111. INSERT INTO `laboratorio` VALUES (4, 'Aula A12', 'Redes', '18');
  112. INSERT INTO `laboratorio` VALUES (5, 'Aula B1', 'Misión Sucre', '20');

Última edición por AnGuisi; 16/07/2013 a las 14:54
  #4 (permalink)  
Antiguo 16/07/2013, 18:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Group by SUBCONSULTA

Bueno, el problema es que necesitas leer con atención el uso de INNER JOIN, algo sobre consistencia e integridad referencia,y en especial bastante sobre consultas en general...
Por empezar, tienes datos inconsistentes en una tabla, porque no existe un horario de ID en cero, por lo que un registro de la tabla relacional no debería existir.
La consulta base que quieres sería mas o menos así:
Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->     e.nombre,
  3.     ->     e.expediente,
  4.     ->     e.correo_electronico,
  5.     ->     h.turno,
  6.     ->     l.nombre
  7.     -> FROM estudiante e
  8.     ->     INNER JOIN estudiante_laboratio_horario elh ON e.idestudiante = elh.idestudiante
  9.     ->     INNER JOIN horario H ON elh.idhorario = h.idhorario
  10.     ->     INNER JOIN laboratorio L ON elh.idlaboratorio = L.idlaboratorio
  11.     -> WHERE elh.idlaboratorio IN (1,2,5)
  12.     -> ORDER BY l.nombre;
  13. +-------------------+------------+----------------------+--------+---------------------+
  14. | nombre            | expediente | correo_electronico   | turno  | nombre              |
  15. +-------------------+------------+----------------------+--------+---------------------+
  16. | Jhonnathan Valera | 27958      | [email protected]   | Noche  | Misi¾n Sucre        |
  17. | Marco Serradas    | 27952      | [email protected] | Tarde  | Misi¾n Sucre        |
  18. | Leonardo Padilla  | 26644      | [email protected] | Ma±ana | Moises Sanchez Leal |
  19. | Gleycer Parra     | 26633      | [email protected]   | Ma±ana | Moises Sanchez Leal |
  20. +-------------------+------------+----------------------+--------+---------------------+
  21. 4 rows in set (0.00 sec)
Esto muestra que tienes un problema posible de collation:
Código MySQL:
Ver original
  1. mysql> SELECT *
  2.     -> FROM laboratorio;
  3. +---------------+-----------+---------------------+------------------+
  4. | idlaboratorio | ubicaci¾n | nombre              | cantidad_equipos |
  5. +---------------+-----------+---------------------+------------------+
  6. |             1 | Aula C7   | Alma Mater          | 15               |
  7. |             2 | Aula A04  | Moises Sanchez Leal | 18               |
  8. |             3 | Aula A03  | OPSU                | 15               |
  9. |             4 | Aula A12  | Redes               | 18               |
  10. |             5 | Aula B1   | Misi¾n Sucre        | 20               |
  11. +---------------+-----------+---------------------+------------------+
  12. 5 rows in set (0.00 sec)
Acá puedes ver que no existe un horario con ID en cero:

Código MySQL:
Ver original
  1. mysql> SELECT *
  2.     -> FROM HORARIO;
  3. +-----------+--------+
  4. | idhorario | turno  |
  5. +-----------+--------+
  6. |         1 | Ma±ana |
  7. |         2 | Tarde  |
  8. |         3 | Noche  |
  9. +-----------+--------+
  10. 3 rows in set (0.00 sec)
Los estudiantes:
Código MySQL:
Ver original
  1. mysql> SELECT *
  2.     -> FROM ESTUDIANTE;
  3. +--------------+---------+------------+----------------------+-------------------+
  4. | idestudiante | nrobeca | expediente | correo_electronico   | nombre            |
  5. +--------------+---------+------------+----------------------+-------------------+
  6. |            1 |       1 | 26633      | [email protected]   | Gleycer Parra     |
  7. |            2 |       1 | 26644      | [email protected] | Leonardo Padilla  |
  8. |            3 |       2 | 27952      | [email protected] | Marco Serradas    |
  9. |            4 |       1 | 27958      | [email protected]   | Jhonnathan Valera |
  10. |            5 |       2 | 29888      | [email protected]    | Kenderbeth L¾pez  |
  11. +--------------+---------+------------+----------------------+-------------------+
  12. 5 rows in set (0.00 sec)
Y la tabla relacional, con el último registro con una inconsistencia evidente:
Código MySQL:
Ver original
  1. mysql> SELECT *
  2.     -> FROM estudiante_laboratio_horario;
  3. +---------------+-----------+--------------+-----------------+
  4. | idlaboratorio | idhorario | idestudiante | lapso_acadÚmico |
  5. +---------------+-----------+--------------+-----------------+
  6. |             2 |         1 |            1 | 1               |
  7. |             2 |         1 |            2 | 1               |
  8. |             5 |         2 |            3 | 1               |
  9. |             5 |         3 |            4 | 1               |
  10. |             1 |         0 |            5 | 1               |
  11. +---------------+-----------+--------------+-----------------+
  12. 5 rows in set (0.00 sec)

Un detalle: Si vas a usar alfabeto en castellano, usa collation utf8_general_ci. de lo contrario te dará problemas.
__________________
¿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 16/07/2013, 19:37
Avatar de AnGuisi  
Fecha de Ingreso: julio-2013
Ubicación: San Felipe - Yaracuy
Mensajes: 122
Antigüedad: 10 años, 9 meses
Puntos: 2
Respuesta: Group by SUBCONSULTA

Muchas gracias amigo. Tomaré en cuenta cada detalle que me has enseñado

Etiquetas: order, registro, select, subconsulta
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 00:17.