[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