Ir al contenido


Foto

consulta mysql


  • Por favor identifícate para responder
17 respuestas en este tema

#1 jooz

jooz

    Member

  • Miembros
  • PipPip
  • 45 mensajes

Escrito 27 octubre 2012 - 09:07

buenos dias... quisiera su ayuda en esta oportunidad con un consulta de mysal que  me lleva loco...


SELECT DISTINCT apellidosnombres, cedula, fechaEntrada, horaEntrada, horaSalida
FROM horarioprof
NATURAL LEFT JOIN entrada
NATURAL LEFT JOIN salida
WHERE fechaEntrada = '26-10-12'



me regresa dos filas la primera  esta bien, el problema es con la segunda ya que la hora de salida deberia ser null y me duplica la hora de la primera fila.... 

gracias por su ayuda......

  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 27 octubre 2012 - 09:15

Deberías darnos un poco más de detalles sobre las estructuras de las tablas, porque no entiendo si tienes dos campos (horaentrada y horasalida) y dos tablas (entradas y salidas) muy similares y logro concibir las uniones.
  • 0

#3 jooz

jooz

    Member

  • Miembros
  • PipPip
  • 45 mensajes

Escrito 27 octubre 2012 - 09:25

tabla entrada:
cedula int (8)
fechaentrada varchar (8)
horaentrada (8)

tabla salida:
cedula int (8)
fechasalida varchar (8)
horaalida varchar (8)

tabla horarioprof:
cedula int(8)
apellidosNombres varchar(50)
seccion varchar(10)
materia varchar(50)
horario varchar(100)
aula varchar(100)
  • 0

#4 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 27 octubre 2012 - 10:26

Pensando un poco en el proceso, me surge la duda: ¿Qué ocurre si un empleado registra más de una vez su entrada o salida? 

en tanto se define eso te propongo la siguiente solución para checadas únicas:


    SELECT horarioprof.cedula, apellidosnombres, horarioprof.fechaEntrada,
                  horaEntrada, horaSalida
        FROM horarioprof
  LEFT JOIN entrada
            on  horarioprof.Cedula = entrada.cedula and
                  horarioprof.fechaEntrada = entrada.fechaEntrada
  LEFT JOIN salida
            on  horarioprof.Cedula = salida.cedula and
                  horarioprof.fechaEntrada = salida.fechasalida
      WHERE horarioprof.fechaEntrada = '27-10-12'


y esta otra para más de un registro de checada por tabla


    SELECT horarioprof.cedula, apellidosnombres, fechaEntrada,
            horaEntrada, horaSalida
        FROM horarioprof
    LEFT JOIN (       
                Select cedula, Max(HoraEntrada) HoraEntrada
                  from entrada
                  where fechaEntrada = '27-10-12'
              ) datent
          on horarioprof.cedula = datent.cedula
    LEFT JOIN (       
                Select cedula, Max(Horasalida) HoraEntrada
                  from salida
                  where fechaSalida = '27-10-12'
              ) datsal
          on horarioprof.cedula = datsal.cedula
        where horarioprof.fechaEntrada = '27-10-12'







  • 0

#5 jooz

jooz

    Member

  • Miembros
  • PipPip
  • 45 mensajes

Escrito 27 octubre 2012 - 11:17

poliburro gracias... la primera consulta la adapte de la siguiente forma ya que la tuya me dio error porque la tabla horarioprof no tiene fecha de entreada solo las de entrada y salida:
SELECT distinct horarioprof.cedula, apellidosnombres, entrada.fechaEntrada, horaEntrada, horaSalida 
FROM horarioprof
LEFT JOIN entrada
ON horarioprof.Cedula = entrada.cedula and
horarioprof.cedula = entrada.cedula
LEFT JOIN salida ON
horarioprof.Cedula = salida.cedula and
entrada.fechaEntrada = salida.fechasalida
WHERE entrada.fechaEntrada = '26-10-12'


pero aun asi sigue duplicando la segunda hora de salida la cual deberia ser null

la segunda consulta que me parece genenial tu conocimiento.... me da el siguiente error
#1140 - Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause... nuevamente muchas gracias.......
  • 0

#6 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 27 octubre 2012 - 11:25

Cierto. olvidé la agrupación  *-)  *-) Así quedaría la consulta corregida:


    SELECT horarioprof.cedula, apellidosnombres, fechaEntrada,
            horaEntrada, horaSalida
        FROM horarioprof
    LEFT JOIN (       
                Select cedula, Max(HoraEntrada) HoraEntrada
                  from entrada
                  where fechaEntrada = '27-10-12'
                group by cedula
              ) datent
          on horarioprof.cedula = datent.cedula
    LEFT JOIN (       
                Select cedula, Max(Horasalida) HoraEntrada
                  from salida
                  where fechaSalida = '27-10-12'
              group by cedula
              ) datsal
          on horarioprof.cedula = datsal.cedula
        where horarioprof.fechaEntrada = '27-10-12'







  • 0

#7 jooz

jooz

    Member

  • Miembros
  • PipPip
  • 45 mensajes

Escrito 27 octubre 2012 - 11:33

:embarrassed:
#1054 - Unknown column 'fechaEntrada' in 'field list'


  • 0

#8 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 27 octubre 2012 - 11:39

probemos con esta mi buen amigo:


  SELECT horarioprof.cedula, apellidosnombres,
        datent.fechaEntrada,
        horaEntrada, horaSalida
    FROM horarioprof
LEFT JOIN (       
          Select cedula, fechaEntrada,
                Max(HoraEntrada) HoraEntrada
            from entrada
          where fechaEntrada = '27-10-12'
                group by cedula
          ) datent
      on horarioprof.cedula = datent.cedula
LEFT JOIN (       
            Select cedula, fechaSalida,
                    Max(Horasalida) Horasalida
              from salida
              where fechaSalida = '27-10-12'
          group by cedula
          ) datsal
      on horarioprof.cedula = datsal.cedula

  • 0

#9 jooz

jooz

    Member

  • Miembros
  • PipPip
  • 45 mensajes

Escrito 27 octubre 2012 - 12:03

compañero poliburro si quieres y no mucho abuso de mi parte te puedo enviar un mp con la sql para  que los pruebes alla y me digas si es algo malo en mis tablas porque no comprendo porqe no sale como quisieramos yo he vito cosas mas complejas con consultas bastantes basicas y tu con esas madres de consulta no devuelve lo que deseamos....
  • 0

#10 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 27 octubre 2012 - 12:31

tu con esas madres de consulta no devuelve lo que deseamos....


jajajaja eso me ha hecho reir... desde qué país escribes amigo? 

Sobre enviar mensaje privado, te comento que para utilidad de toda la comunidad siempre tratamos de colocar toda la información en los hilos pues este problema puede serle de ayuda a otro colega. Ahora que si los datos que mostrarás son confidenciales... bueno, ese es otro decir.

En resumen amigo, si te es posible, aquí mismo coloca tus consultas y datos, seguro que si no soy yo alguién más podría aportar luz sobre el problema
  • 0

#11 jooz

jooz

    Member

  • Miembros
  • PipPip
  • 45 mensajes

Escrito 27 octubre 2012 - 12:49

jejejeje escribo desde Falcón Venezuela......
aqui las tablas....

CREATE TABLE IF NOT EXISTS `entrada` (
  `cedula` int(8) NOT NULL,
  `fechaEntrada` varchar(8) collate utf8_spanish_ci NOT NULL,
  `horaEntrada` varchar(8) collate utf8_spanish_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

INSERT INTO `entrada` (`cedula`, `fechaEntrada`, `horaEntrada`) VALUES
(16333540, '26-10-12', '10:59:10'),
(16333540, '26-10-12', '06:06:09');

CREATE TABLE IF NOT EXISTS `horarioprof` (
  `cedula` int(8) NOT NULL,
  `apellidosNombres` varchar(50) collate utf8_spanish_ci NOT NULL,
  `seccion` varchar(10) collate utf8_spanish_ci NOT NULL,
  `materia` varchar(50) collate utf8_spanish_ci NOT NULL,
  `horario` varchar(100) collate utf8_spanish_ci NOT NULL,
  `aula` varchar(6) collate utf8_spanish_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

INSERT INTO `horarioprof` (`cedula`, `apellidosNombres`, `seccion`, `materia`, `horario`, `aula`) VALUES
(15806718, 'SIBADA LUQUEZ, OLGA ODALY', 'A3AA01', 'ARA.ADU.NOM.', 'Lunes Hora:07:30am a 08:50am', 'A204'),
(16333540, 'PINEDA ACEVEDO, JERSO ELIMAR', 'A5GA01', 'APL.MOD.INF.', 'Martes Hora:07:30am a 08:50am', 'A113'),
(16333540, 'PINEDA ACEVEDO, JERSO ELIMAR', 'A1FA01', 'INT.INFORMAT.', 'Martes Hora:09:00am a 10:20am', 'A206'),
(17309046, 'DE LA ROSA TORRES, JUAN FRANCI', 'A3NA02', 'APL.MOD.INF.', 'Martes Hora:06:00pm a 07:20pm', 'A108'),
(16333540, 'PINEDA ACEVEDO, JERSO ELIMAR', 'A5GA02', 'APL.MOD.INF.', 'Martes Hora:06:00pm a 07:20pm', 'A113'),

CREATE TABLE IF NOT EXISTS `salida` (
  `cedula` int(8) NOT NULL,
  `fechaSalida` varchar(8) NOT NULL,
  `horaSalida` varchar(8)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

INSERT INTO `salida` (`cedula`, `fechaSalida`, `horaSalida`) VALUES
(16333540, '26-10-12', '12:30:00');


  • 0

#12 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 27 octubre 2012 - 01:57

puedes incluirme por favor la consulta que estas ejecutando y una muestra de como es el resultado que deberías obtener
  • 0

#13 jooz

jooz

    Member

  • Miembros
  • PipPip
  • 45 mensajes

Escrito 27 octubre 2012 - 02:17

modifique la estructura en salida, estaba como date...

ahora sale asi tal vez ahor sea mas facil.......
fijate que se repiten el resultado.... deberia ser solo dos filas no 4
quedaria solo la fila 1 y 4 las 2 y 3 estan mala......

Archivos adjuntos


  • 0

#14 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 27 octubre 2012 - 02:32

modifique la estructura en salida, estaba como date...

ahora sale asi tal vez ahor sea mas facil.......
fijate que se epiten el resultado.... deberia ser solo dos filas no 4


Qué consulta estás ejecutando?
  • 0

#15 jooz

jooz

    Member

  • Miembros
  • PipPip
  • 45 mensajes

Escrito 27 octubre 2012 - 02:39

fijate que se repiten el resultado.... deberia ser solo dos filas no 4
quedaria solo la fila 1 y 4 las 2 y 3 estan mala......


SELECT DISTINCT horarioprof.cedula, apellidosnombres, entrada.fechaEntrada, horaEntrada, horaSalida
FROM horarioprof
LEFT JOIN entrada ON horarioprof.Cedula = entrada.cedula
LEFT JOIN salida ON horarioprof.Cedula = salida.cedula
AND entrada.fechaEntrada = salida.fechasalida
WHERE entrada.fechaEntrada = '26-10-12'

  • 0

#16 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 27 octubre 2012 - 03:10

por fin entiendo tu predicamento....

Dado que tienes dos entradas y una salida tu esperas que la consulta te muestre dos registros. En el primer registro la hora de entrada con su correspondiente salida y en el siguiente registro la hora de entrada con un nulo como salida.

Bueno con tu estructura de tablas no es posible hacerlo en una consulta. Esto debido a que la condición que liga ambos procesos (entrada/salida) es la fecha, por tanto para cada entrada del día 26 corresponden tantas salidas como hayan sido registradas. En tu caso solo checó una vez por tanto se muestran las dos entradas con la misma salida. Si hubiera salido dos veces serían 4 filas, pues por cada entrada del día 26 le corresponden dos salidas y así sucesivamente....

Como solucionarlo? muy sencillo, si no deseas modificar el diseño de tus tablas el mejor camino sería meter un cursor en un procedimiento almacenado y que sea este el que te devuelva el resultado.

otra solución sería que rediseñes tus tablas y agreges una llave adicional a la fecha que sea única. De esta manera podrás relacionar cada salida con su respectiva entrada.



  • 0

#17 jooz

jooz

    Member

  • Miembros
  • PipPip
  • 45 mensajes

Escrito 27 octubre 2012 - 03:24

perdona mi ignorancia pero no se como hacer lo que dices de

meter un cursor en un procedimiento almacenado y que sea este el que te devuelva el resultado.

si me  orientas te lo agradeceria o si me dices que debo investigar para realizar eso.... ?????? :) me gustan lo retos y realizar cosas que no se pues asi voy aprendiendo cada dia mas.... :) :) :) :) :)
  • 0

#18 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 27 octubre 2012 - 03:29

aquí como crear un procedimiento almacenado:

http://dev.mysql.com...f-triggers.html

y aquí un cursor...

http://dev.mysql.com...es/cursors.html


Si logró hacerme de tiempo el día de mañana publico una entrada en mi blog explicando como se programan los procedimientos almaceandos en mysql y cómo se programan los cursores...


saludox
  • 0




IP.Board spam blocked by CleanTalk.