2012-08-27 5 views
6

Duplicar posible:
Calculating total quantity of equipments for a date rangeCómo Summ cantidad total de equipos en la fecha dada rangos

Proyecto: Estoy trabajando en un proyecto que es alrededor de algunas habitaciones y equipos que utilizan en el habitaciones. El software se trata de programar los equipos en las habitaciones. En otras palabras, es un software de reserva que reserva los equipos seleccionados en salas separadas para las fechas y los intervalos de tiempo necesarios. Tengo muchas tablas en la base de datos MYsSQL trabajando con Php, pero mencionaré las tablas de las que se trata mi pregunta. Las tablas que relacionaré con mis preguntas son la tabla de equipos (Tabla A), la tabla de horarios (Tabla B) y los equipos que se usan en el programa relacionado (Tabla C).

Tabla A: tabla de lista de equipos

+------+----------+-----------+ 
| eqid | eqName | available | 
+------+----------+-----------+ 
| 1 | book  |  90 |  
| 2 | pen  |  82 | 
| 3 | computer |  25 | 
+------+----------+-----------+  

En la tabla A; eqid representa la identificación única de un equipo, eqName representa el nombre de un equipo, disponible representa el total de equipos disponibles existentes.

Tabla B: tabla de programación

+------------+------------+------------+-----------+----------+--------+ 
| scheduleid | startDate | endDate | startTime | endTime | office | 
+------------+------------+------------+-----------+----------+--------+ 
|   1 | 2012-08-27 | 2012-08-27 | 08:30:00 | 10:00:00 | room1 | 
|   2 | 2012-08-27 | 2012-08-27 | 09:30:00 | 11:00:00 | room3 | 
|   3 | 2012-08-28 | 2012-08-30 | 08:30:00 | 12:00:00 | room2 | 
|   4 | 2012-08-29 | 2012-08-31 | 11:30:00 | 14:00:00 | room1 | 
|   5 | 2012-08-28 | 2012-08-28 | 10:30:00 | 14:00:00 | room3 | 
|   6 | 2012-08-27 | 2012-08-30 | 08:30:00 | 10:00:00 | room4 | 
|   7 | 2012-08-27 | 2012-08-27 | 10:30:00 | 12:00:00 | room4 |  
|   8 | 2012-08-27 | 2012-08-30 | 08:30:00 | 11:00:00 | room6 | 
|   9 | 2012-08-27 | 2012-08-27 | 10:30:00 | 12:00:00 | room5 | 
+------------+------------+------------+-----------+----------+--------+  

En la tabla B; Scheduid representa ID único para un cronograma, startDate y endDate son rangos de fechas para un cronograma, horario de inicio y horario de tiempo de finalización para un cronograma, la oficina significa que el cronograma tendrá lugar. Déjame dar un ejemplo aquí. Scheduleid 1 significa que hay una reserva el 27 de agosto de 2012, el lunes y es de 08.30 a 10:00. Como comienza y termina el mismo día, es solo un día de reserva en room1. Sin embargo, Scheduleid 3 significa que hay una reserva que comienza el 28 de agosto de 2012, martes y continúa hasta el 30 de agosto de 2012, jueves a las 08: 00-12: 00 ... en otras palabras, dura 3 días y todos los días desde 08:30 a 12:00 ... Así que hay una reserva de martes a jueves de 08:30 a 12:00 en la habitación2 ... Espero que esto esté claro.

Cuadro C: equipos utilizando en la programación relacionada

+--------+------------+------+-------------+ 
| Autoid | scheduleid | eqid | amountInSch | 
+--------+------------+------+-------------+ 
|  1 |   1 | 1 |   2 |  
|  2 |   1 | 2 |   3 | 
|  3 |   1 | 3 |   1 | 
|  4 |   2 | 1 |   1 | 
|  5 |   2 | 2 |   1 | 
|  6 |   2 | 3 |   2 | 
|  7 |   3 | 2 |   1 | 
|  8 |   3 | 3 |   3 | 
|  9 |   4 | 2 |   1 | 
|  10 |   4 | 3 |   1 | 
|  11 |   5 | 1 |   1 | 
|  12 |   6 | 1 |   1 | 
|  13 |   6 | 3 |   2 | 
|  14 |   6 | 2 |   4 | 
|  15 |   7 | 1 |   5 | 
|  16 |   7 | 2 |   6 | 
|  17 |   8 | 2 |   1 | 
|  18 |   9 | 1 |   8 | 
|  19 |   9 | 2 |   5 | 
|  20 |   9 | 3 |   6 | 
+--------+------------+------+-------------+ 

en la Tabla C: AutoID representa Identificación automática único generado por incremento automático, scheduleid proviene de la Tabla B, eqid proviene de la Tabla A, amountInSch representa cómo muchos equipos (cantidad) usarán en el programa relacionado. Quiero dar un ejemplo aquí. Scheduleid 1 en la Tabla C, hay 3 filas. Esto significa que el planid 1 relacionado en TAble B usará 2 libros (eqid 1), 3 plumas (eqid 2) y 1 computadora (eqid 3) en la habitación 1 de las fechas y horas especificadas en la tabla B. Otro ejemplo es que el planid 3 en la Tabla C está relacionado con 2 filas. Significa que 1 bolígrafo (eqId 2) y 3 computadoras (eqId 3) se usarán en room2 del 27 al 30 de agosto de 2012 todos los días de 08:30 a 12:00.

Lo anterior es la explicación y brinda cierta información sobre el proyecto. Las filas de la tabla no son permanentes. Cuando realiza una reserva, no habrá una nueva fila en la tabla B y si se selecciona un equipo, no habrá nuevas filas en la tabla C ...

La Pregunta:

Quiero calcular la izquierda cantidad de un equipo específico cuando proporciono eqId, startDate, endDate, startTime y endTime ...

Un ejemplo:

eqId: 1 (libro)

startDate: 2012-08-27

endDate: 2012-08-27

horaInicio: 08:30:00

endTime: 12:00:00

resultado debe ser: 14 libros usados ​​en sche dule y 76 libros disponibles

Porque: si miras calendarios y eqIdos relacionados, solo verás 1, 2, 6, 7, 9 calendarios relacionados con mi consulta (fechas y eqId). Si suma la cantidad total relacionada en la Tabla C, obtendrá el resultado incorrecto. En otras palabras, las cantidades relacionadas para eqId (1-libro) y para 1, 2, 6, 7, 9 scheduleIds son 2, 1, 1, 5, 8 respectivamente. Entonces, si los suma, obtendrá 17, lo cual es incorrecto. Porque el horario 1 y 9 no se cruzan entre sí en términos de tiempos de inicio y final, y 6 y 7 tampoco se cruzan entre sí. como resultado de ellos, 2 se quedan solos y se pueden contar por separado. Debemos considerar 1 y 9 como sumados 8 porque 8 es mayor que 2. es igual para 6 y 7, se considera como 5 porque de 5 es mayor que 1 ...

Así que amigos! No estoy seguro de cómo puedo sumar/esto en el algoritmo de programación. ¿Hay alguna manera de hacerlo en SQL o tengo que usar PHP y Mysql juntos? ¿y cómo?

SQLFiddle Records

+0

Sin venir por una idea (lo siento) ... ¿no sería más fácil utilizar las columnas 'DATETIME' en lugar de las columnas' DATE' y 'TIME'? Y luego: si un horario es de 9:00 a 10:00 y el siguiente es de 10:00 a 11:00 ¿sería posible usar un equipo? ¿Son ambos horarios si no están en la misma habitación? Tendría que transportarlos de X a Y, lo que generalmente lleva un tiempo. Entonces, tal vez "no intersectar" no es lo suficientemente fuerte aquí. – Jens

+0

@Jens es posible llevar los equipos de habitación en habitación. Y habrá descansos entre los horarios. Se inició así para los campos DATE y TIME, por lo que es difícil cambiarlo ahora ... – deepnote

Respuesta

0

Hay diferentes maneras de lograr esto - que voy a señalar a algo que se puede utilizar con la mayoría de DB-motores.

En mysql, es posible fusionar tablas en una sola consulta. Lo que necesita es algo a lo largo de la línea de esta:

$eqid = 1; 
$startDate = "2012-08-27"; 
$endDate = "2012-08-27"; 
$startTime = "08:30:00"; 
$endTime = "12:00:00"; 
$sql = "SELECT SUM(`amountInSch`) FROM `table_c`,`table_b` WHERE `eqid` = $eqid 
    AND `startDate` >= '$startDate' AND `startDate` <= '$endDate' AND `endDate` 
    <= '$endDate' AND `endDate` >= '$startDate' AND `startTime` >= '$startTime' 
    AND `startTime` <= '$endTime' AND `endTime` <= '$endTime' AND `endTime` >= 
    '$startTime' AND `table_b`.`scheduleid` = `table_c`.`scheduleid`"; 
$r = mysql_query($sql); 
$n = mysql_result($r,0,0); 

El truco es usar el (debido algunas citas faltan para el marcado de aquí) table_b`.`scheduleid` = `table_c`.`scheduleid para fusionar las dos tablas.

+0

esto no está funcionando. Cuando ejecuto esta consulta como "SELECT SUM (' amountInSch') FROM 'Table3',' Table2' WHERE 'eqid' = 1 AND' startDate' <= '2012-08-27' AND 'endDate'> = '2012 -08-27 'AND 'startTime' <= '08: 30: 00' AND 'endTime'> '12: 00: 00' AND' Table2''scheduleid' = 'Table3''scheduleid'" , su resultado es NULL. y esto no me parece lógico, ya que solo SUMA el campo amountInSch. Debería considerar la intersección del tiempo ... – deepnote

+0

Parece que accidentalmente volteé la lógica: todos los <= deben ser> = y viceversa. Estoy editando mi respuesta anterior para que aparezca correcta. – ipoga

+0

, la parte viceversa está bien ahora, pero el resultado es incorrecto. Debería ser 14 no 16 ... – deepnote

Cuestiones relacionadas