[Php-avanzado] Consulta sobre Query

Leonardo Tadei - Pegasus Tech Supply leonardot en pegasusnet.com.ar
Vie Mar 2 13:23:11 ART 2012


Hola Pablo,

	lo que estás necesitando tiene esta forma:

SELECT *, (hora_salida - hora_entrada) AS sumahoras
FROM `asistencias`
GROUP BY id_alumno

	en donde proyectás la diferencia de las horas de salida menos las horas
de entrada, agrupándolas por id_alumno.

	El único problema que vas a tener con esto es el cálculo respecto de
las horas del plan, porque estás guardándolas en un int(10), con lo que
están expresados de diferente manera y vas a tener que hacer
conversiones.

	Podrías cambiar el tipo de campo a date, para que los cálculos sean más
fáciles, y que incluso te los devuelva la misma query.
	De todas formas, con ese campo de tipo int(10) podrías guardar las
horas en minutos y hacer el cálculo igual. Dependerá de como pensaste
guardar ahí las horas, ya que el ser int(10) no podés guardar 1,5 para
una hora y media, pero tampoco 1:20 como ponés en tu ejemplo.

	Ejecutá la query y fijate el resultado, para ayudarte a ver como te
conviene almacenar horas_por_dia.
	También fijate que no tiene sentido proyectar *, porque al agrupar
verás solo un valor de hora_salida y de hora_entrada, y parecerá que la
cuenta está mal sacada.

	Armate un lote de pruebas del que conozcas los resultados que deben dar
las querys, así testeas que te devuelvan lo que estás esperando.

	Seguimos!

El jue, 01-03-2012 a las 10:29 -0300, pablo beroiza escribió:
> Hola Leo: Perdón por ser tan escueto en la explicación (Solo te estaba
> dando la parte que me esta dando problemas). Si, la solución que me
> planteas es para los totales, que esta buenísima, pero yo quiero
> esa proyección para hacer una resta parcial, por día, en donde muestro
> la resta de los totales por día, osea los "saldo horas"("hora de
> salida menos hora de entrada") menos "hora por dia". 
> En el id_asistencia 6 debería mostrar en el "saldo" 1:15 y no -0:05 ya
> que es el mismo día de taller.
>    
> "Total por dia" y "Saldo horas" son campos calculados con php.
> -Esta es la proyección que obtengo
>                                            (por plan)
>                    H total     Saldo
> id_asistencia   fecha           horas por dia    Entrada   Salida
>  por dia     horas
>  3                  16/02/2012          1:20       <-14:00 -    17:00
> ->     03:00      1:40 
>  1                   22/02/2012         1:20       <- 7:00 -     12:00
> ->     05:00      3:40 
>  4                   23/02/2012         1:20       <- 14:00 -   15:00
> ->     01:00     -0:20 
>  6                   23/02/2012         1:20       <- 10:00 -   11:15
> ->     01:15     -0:05 (esta mal)
>  9                   24/02/2012         1:20       <- 13:00 -   13:20
> ->     00:20     -1:00 
> 
>                        TOTAL      3:55 horas adelantadas
> 
> 
> Esto es lo que quiero mostrar:
>                                            (por plan)
>                    H total     Saldo
> id_asistencia   fecha           horas por dia    Entrada   Salida
>  por dia     horas
>  3                  16/02/2012          1:20       <-14:00 -    17:00
> ->     03:00      1:40 
>  1                   22/02/2012         1:20       <- 7:00 -     12:00
> ->     05:00      3:40 
>  4                   23/02/2012         1:20       <- 14:00 -   15:00
> ->     01:00     -0:20 
>  6                   23/02/2012                      <- 10:00 -
> 11:15 ->     01:15      1:15 (esta bien)
>  9                   24/02/2012         1:20       <- 13:00 -   13:20
> ->     00:20     -1:00 
> 
>                        TOTAL      5:15 horas adelantadas
> 
>      
> Saludos, y Gracias!!!
> 
> 
> 
> 
> 
> El 29 de febrero de 2012 22:07, Leonardo Tadei - Pegasus Tech Supply
> <leonardot en pegasusnet.com.ar> escribió:
>         Hola Pablo,
>         
>                No entiendo qué sentido semántico tiene la proyección
>         que querés
>         hacer :(
>                Me desorienta que quieras proyectar el campo
>         `horas_por_dia` y no la
>         suma de las horas de cada día de cada alumno, o las horas de
>         entrada y
>         de salida.
>         
>                La estructura de la tabla "asistencias" es:
>         
>         CREATE TABLE IF NOT EXISTS `asistencias` (
>          `id_asistencia` int(10) NOT NULL AUTO_INCREMENT,
>          `id_alumno` int(10) DEFAULT NULL,
>          `id_taller` int(10) DEFAULT NULL,
>          `taller` varchar(50) COLLATE latin1_general_ci DEFAULT NULL,
>          `id_plan` int(10) DEFAULT NULL,
>          `nombre_plan` varchar(50) COLLATE latin1_general_ci DEFAULT
>         NULL,
>          `horas_por_dia` int(10) unsigned DEFAULT NULL,
>          `hora_entrada` datetime DEFAULT NULL,
>          `hora_salida` datetime DEFAULT NULL,
>          `fecha` date DEFAULT NULL,
>          `comentario` text COLLATE latin1_general_ci,
>          PRIMARY KEY (`id_asistencia`)
>         )
>         
>                Si lo que quisieras es saber qué alumnos fueron cada
>         día, bastaría con
>         que le agregues a la proyección GROUP BY `fecha`
>                En este resultado los registros de tu ejemplo con ID 6
>         y 9 no
>         aparecerían, sino que solo aparecería el 12, porque están
>         agrupados.
>         
>                Contanos qué resultado querés obtener, pero en
>         castellano, y después
>         armamos la query. Por ejemplo:
>         1) proyectar todos los días que los alumnos asistieron a un
>         taller
>         [id_taller, id_alumno, fecha]
>         2) Proyectar la cantidad de horas por día que cursó un alumno
>         cada día
>         [id_alumno, fecha, suma horas cursadas, horas_por_dia]
>         
>                Saludos!
>         
>         
>         PD: actualizá el asunto del mensaje ;-)
>         
>         
>         El mié, 29-02-2012 a las 17:39 -0300, pablo beroiza escribió:
>         
>         > Leo! aca mando la estructura y como tendría que quedar la
>         consulta.
>         > Espero que se entienda
>         >
>         >
>         > Esta es un ejemplo de la consulta a la tabla "asistencias"
>         >
>         >
>         > id_asistencia fecha hora por dia
>         > 3 16/02/2012 1:20
>         > 1 17/02/2012 1:20
>         > 4 18/02/2012 1:20
>         > 6 18/02/2012 1:20
>         > 9 18/02/2012 1:20
>         > 12 20/02/2012 1:20
>         
>         
>         
>         > Lo que yo quiero es: si es igual a la fecha anterior no
>         poner hora
>         > por día ya que puede ser que trabaje dos o tres veces en el
>         día.
>         >
>         >
>         > id_asistencia fecha hora por dia
>         > 3 16/02/2012 1:20
>         > 1 17/02/2012 1:20
>         > 4 18/02/2012 1:20
>         > 6 18/02/2012
>         > 9 18/02/2012
>         > 12 20/02/2012 1:20
>         > Gracias!!!
>         >
>         > El 28 de febrero de 2012 15:20, Leonardo Tadei - Pegasus
>         Tech Supply
>         > <leonardot en pegasusnet.com.ar> escribió:
>         >         Hola Pablo,
>         >
>         >         El mar, 28-02-2012 a las 14:53 -0300, pablo beroiza
>         escribió:
>         >         > Leo: Gracias por el concejo. Voy hacerlo con una
>         tabla a
>         >         parte ya que
>         >         > entran los alumnos, solo para ver las horas que le
>         >         corresponden a su
>         >         > id_alumno. Y los profesores entrarían para agregar
>         horas.
>         >
>         >
>         >                Entonces es un buen candidato para manejar la
>         >         autentificación por
>         >         separado...
>         >
>         >         >  Ahora te hago un par de consultas: descargue una
>         clase para
>         >         hacer la
>         >         > autenticacion. ¿Puedo hacerle las modificaciones
>         necesarias
>         >         para
>         >         > adaptarlo a mi proyecto? ya que viene con motor
>         InnoDB y
>         >         tendria que
>         >         > agregar un par de campos mas.
>         >
>         >
>         >                Claro que sí!
>         >                Es muy raro el poder usar código de terceros
>         tal y como
>         >         viene: siempre
>         >         hacen falta adaptaciones, traducciones y detalles.
>         >                Por el InnoDB no te preocupes: cuando
>         importes la tabla
>         >         sacale el tipo
>         >         o directamente ponele MyISAM así te queda como las
>         demás.
>         >
>         >         > La otra pregunta es ¿Cómo puedo comparar dos
>         registros de
>         >         una misma
>         >         > tabla? Quiero comparar el segundo registro con el
>         primero,
>         >         el tercero
>         >         > con el segundo, el cuarto con el tercero...etc.
>         Probé con
>         >         > mysql_data_seek  pero no consigo hace lo que
>         quiero. ¿Me
>         >         darias una
>         >         > mano con eso?
>         >
>         >
>         >                Lo decís muy en general, pero parece que lo
>         que tenés
>         >         que hacer es una
>         >         query que te devuelva la comparación que te hace
>         falta, y no
>         >         tratar de
>         >         comprar desde PHP sobre un volumen de datos.
>         >
>         >                De qué tipo es la comparación? Si son
>         mayores? menores?
>         >         iguales?
>         >                Pasá por acá la estructura de las tablas y 2
>         o 3
>         >         registros de ejemplo,
>         >         y vemos de armar la query necesaria.
>         >
>         >         >  Gracias!!!
>         >
>         >                Por nada!
>         >
>         >         --
>         >
>         >         Leonardo Tadei
>         >         leonardot en pegasusnet.com.ar
>         >         Pegasus Tech Supply
>         >         Tel: (+54)(+223) 471-2880
>         >         La Salle 1131 - Mar del Plata - Argentina
>         >         http://www.pegasusnet.com.ar /
>         http://blog.pegasusnet.com.ar
>         >         http://www.prometeustech.com.ar /
>         http://www.grupopegasus.com
>         >
>         >         Firma pública:
>         >
>         http://www.pegasusnet.com.ar/LeonardoTadei-public.key
>         >
>         >         _______________________________________________
>         >         Php-avanzado mailing list
>         >         Php-avanzado en pato2.fi.mdp.edu.ar
>         >
>         http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>         >
>         >
>         >
>         > _______________________________________________
>         > Php-avanzado mailing list
>         > Php-avanzado en pato2.fi.mdp.edu.ar
>         >
>         http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>         
>         
>         --
>         Leonardo Tadei
>         leonardot en pegasusnet.com.ar
>         Blog: http://blog.pegasusnet.com.ar
>         
>         Firma pública:
>         http://www.pegasusnet.com.ar/LeonardoTadei-public.key
>         
>         _______________________________________________
>         Php-avanzado mailing list
>         Php-avanzado en pato2.fi.mdp.edu.ar
>         http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>         
> 
> 
> _______________________________________________
> Php-avanzado mailing list
> Php-avanzado en pato2.fi.mdp.edu.ar
> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado

-- 
Leonardo Tadei
leonardot en pegasusnet.com.ar
Blog: http://blog.pegasusnet.com.ar
Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key



Más información sobre la lista de distribución Php-avanzado