[Php-avanzado] Consulta sobre Query

pablo beroiza beroiza.pablo en gmail.com
Sab Mar 3 23:47:01 ART 2012


El 2 de marzo de 2012 13:23, Leonardo Tadei - Pegasus Tech Supply <
leonardot en pegasusnet.com.ar> escribió:

> Hola Pablo,
>
>        lo que estás necesitando tiene esta forma:
>
> SELECT *, (hora_salida - hora_entrada) AS sumahoras
> FROM `asistencias`
> GROUP BY id_alumno
>
> Hola Leo!!! con esta consulta solo consigo hacer la resta de la
"hora_salida" menos "hora_entrada" agrupadas por "id_alumno" ya la estoy
ocupando para sacar las horas que trabaja por dia "sumahoras".
Lo que quiero es mostrar o proyectar "horas_por_dia"solo una vez cuando el
alumno trabaja mas de una vez por día, para poder hacer el calculo del
"saldo por dia" (es un calculo parcial). Si el alumno trabajo 2 veces en el
dia no puedo tomarle en cuenta "horas_por_dia" dos veces, lo tengo que
hacer solo una vez. Si hago una consulta general lo puedo hacer, pero lo
que quiero es mostrarlo detallado por dia y ahi esta el problema.

+-----------+----------+
| id_alumno | sumahoras |
+-----------+----------+
| 1         | 7800     |
| 2         | 1500     |
+-----------+----------+



select * from asistencias						where id_alumno = $id_alumno

Esto es lo que proyecto con la consulta

+------------+---------------+--------------+-------------+
| fecha      | horas_por_dia | hora_entrada | hora_salida |
+------------+---------------+--------------+-------------+
| 15/02/2012 | 2:00          | 14:00        |  15:00      |
| 16/02/2012 | 2:00          | 15:00        |  15:30      |
| 17/02/2012 | 2:00          | 14:00        |  15:00      |
| 17/02/2012 | 2:00          | 17:00        |  18:00      |
| 18/02/2012 | 2:00          | 14:00        |  17:00      |
+------------+---------------+--------------+-------------+

Esto es lo que quiero proyectar con la consulta. Capaz con MySql no se
puede y hay que hacerlo con php. Pero ese es el dilema no me sale con
ninguno de los dos. [?] Bueno espero poder hacerme entender. Desde ya
Gracias!!!

+------------+---------------+--------------+-------------+
| fecha      | horas_por_dia | hora_entrada | hora_salida |
+------------+---------------+--------------+-------------+
| 15/02/2012 | 2:00          | 14:00        |  15:00      |
| 16/02/2012 | 2:00          | 15:00        |  15:30      |
| 17/02/2012 | 2:00          | 14:00        |  15:00      |
| 17/02/2012 |               | 17:00        |  18:00      |
| 18/02/2012 | 2:00          | 14:00        |  17:00      |
+------------+---------------+--------------+-------------+






       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     Saldoid_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
>
> _______________________________________________
> Php-avanzado mailing list
> Php-avanzado en pato2.fi.mdp.edu.ar
> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://www3.fi.mdp.edu.ar/pipermail/php-avanzado/attachments/20120303/d0347306/attachment-0001.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: 344.png
Type: image/png
Size: 667 bytes
Desc: no disponible
URL: <http://www3.fi.mdp.edu.ar/pipermail/php-avanzado/attachments/20120303/d0347306/attachment-0001.png>


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