Consulta para mostrar horario de clases en MySQL

publicado por: Anonymous

Buenas tardes, estoy tratando de generar un horario de clases y llevo varios días sin poder generar el horario mediante una consulta en MySQL.

La consulta que estoy realizando en MySQL es la siguiente:

SELECT CONCAT(DATE_FORMAT(h.hora_inicio,"%H:%i")," - ",DATE_FORMAT(h.hora_fin,"%h:%i")) hora,
CASE WHEN ho.dia="Lunes" THEN ho.nombre ELSE '' END Lunes,
CASE WHEN ho.dia="Martes" THEN ho.nombre ELSE '' END Martes,
CASE WHEN ho.dia="Miercoles" THEN ho.nombre ELSE '' END Miercoles,
CASE WHEN ho.dia="Jueves" THEN ho.nombre ELSE '' END Jueves,
CASE WHEN ho.dia="Viernes" THEN ho.nombre ELSE '' END Viernes,
CASE WHEN ho.dia="Sabado" THEN ho.nombre ELSE '' END Sabado FROM    (
        SELECT h.codigo_hora,h.codigo_docentes,c.nombre,h.dia 
          FROM horario h 
    INNER JOIN curso c 
            ON c.codigo_curso=h.codigo_curso
) ho 
INNER JOIN docentes d 
        ON d.codigo_docentes=ho.codigo_docentes 
INNER JOIN hora h 
        ON h.codigo_hora=ho.codigo_hora 
  GROUP BY hora 
  ORDER BY hora ASC

El resultado obtenido al ejecutar la consulta es el siguiente: HORARIO DE CLASES

Tengo varios registros de mis cursos asignados a docentes en diferentes horas pero no me muestra como debería de ser el horario de clases, en varias celdas me sale vacío y no sé en qué estaría mal la consulta, ya que tengo varios registros. Ojala puedan ayudarme a solucionar este problema.

solución

Necesitas usar una función de agregación para las columnas que no estás usando en el GROUP BY (en la mayoría de los motores de bases de datos es obligación, MySQL lo permite, pero te entrega resultados como estos). El código sería:

SELECT  CONCAT(DATE_FORMAT(h.hora_inicio,"%H:%i")," - ",DATE_FORMAT(h.hora_fin,"%h:%i")) hora,
        MAX(CASE WHEN ho.dia = 'Lunes' THEN ho.nombre ELSE '' END) Lunes,
        MAX(CASE WHEN ho.dia = 'Martes' THEN ho.nombre ELSE '' END) Martes,
        MAX(CASE WHEN ho.dia = 'Miercoles' THEN ho.nombre ELSE '' END) Miercoles,
        MAX(CASE WHEN ho.dia = 'Jueves' THEN ho.nombre ELSE '' END) Jueves,
        MAX(CASE WHEN ho.dia = 'Viernes' THEN ho.nombre ELSE '' END) Viernes,
        MAX(CASE WHEN ho.dia = 'Sabado' THEN ho.nombre ELSE '' END) Sabado 
FROM (  SELECT  h.codigo_hora,
                h.codigo_docentes,
                c.nombre,
                h.dia 
        FROM horario h 
        INNER JOIN curso c 
            ON c.codigo_curso = h.codigo_curso) ho 
INNER JOIN docentes d 
    ON d.codigo_docentes = ho.codigo_docentes 
INNER JOIN hora h 
    ON h.codigo_hora = ho.codigo_hora 
GROUP BY CONCAT(DATE_FORMAT(h.hora_inicio,"%H:%i")," - ",DATE_FORMAT(h.hora_fin,"%h:%i")) 
ORDER BY CONCAT(DATE_FORMAT(h.hora_inicio,"%H:%i")," - ",DATE_FORMAT(h.hora_fin,"%h:%i")) ASC;
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *