2012-08-01 15 views
5

Juego muchos juegos de mesa y tengo un sitio/base de datos que realiza un seguimiento de varias estadísticas. Una de las tablas realiza un seguimiento de varias veces. Su estructura se parece a esto:Consulta de Mysql al tiempo promedio

  • GAMENAME (texto - el nombre del juego de mesa)
  • numPeople (int - el número de personas que han jugado)
  • timeArrived (marca de tiempo - el momento en que llegamos a la casa estamos jugando el juego)
  • beginSetup (indicación de tiempo - el momento en que comenzamos a configurar el juego)
  • startPlay (marca de tiempo - el tiempo de pasar concretamente a jugar el juego)
  • gameEnd (marca de tiempo - el tiempo que el juego ha terminado)

Básicamente, lo que estoy queriendo hacer es el uso estos tiempos para obtener información interesante/útil de (como qué juego demora más tiempo establecer en promedio, qué juego tarda más tiempo en jugar, qué juego es el más largo desde la llegada hasta el final, etc.) Normalmente, Depende demasiado de PHP y solo seleccionaría * ... y tomaría todas las veces, luego haría algunos cálculos de PHP para encontrar todas las estadísticas, pero sé que MySQL puede hacer todo esto por mí con una consulta. Desafortunadamente, me pierdo bastante cuando se trata de consultas más complejas, así que me gustaría obtener ayuda.

Me gustaría tener algunos ejemplos de un par de consultas y ojalá pueda resolver otras consultas de tiempo promedio una vez que alguien me haya iniciado. ¿Cuál sería la consulta más larga en promedio para jugar un juego de mesa? ¿Qué pasa con el juego/tiempo más rápido para configurar en promedio?

Información adicional: drew010 - Tienes un buen comienzo pero no obtengo los resultados que esperaba. Te he dado algunos ejemplos reales ... Tengo un juego llamado Harper y se ha jugado dos veces (por lo que hay dos registros en la base de datos con el tiempo). Aquí son lo que los tiempos parecen por ello:

beginSetup(1) = 2012-07-25 12:06:03 
startPlay(1) = 2012-07-25 12:47:14 
gameEnd(1) = 2012-07-25 13:29:45 

beginSetup(2) = 2012-08-01 12:06:30 
startPlay(2) = 2012-08-01 12:55:00 
gameEnd(2) = 2012-08-01 13:40:32 

Cuando ejecute la consulta que me ha proporcionado (y puedo convertir los segundos en horas/minutos/segundos) consigo estos resultados (lo siento, no lo sé saber cómo hacer la tabla de onda en la que hizo):

gameName = Harper 
Total Time = 03:34:32 
...and other incorrect numbers. 

a partir de los números, el tiempo promedio total debe ser de aproximadamente 1 hora y 24 minutos - no de 3 horas y 34 minutos. ¿Alguna idea de por qué obtendría números incorrectos?

+0

No se puede responder sin saber cuáles son sus mesas parecen. De lo contrario, solo lanzamos dardos en la oscuridad. –

+0

"[El] tiempo más largo en promedio"? No estoy seguro de seguir. ¿Cómo promedias el "tiempo más largo" si no tienes subgrupos para tomar "tiempos más largos"? – Palladium

+0

@Palladium Creo que OP quiere una consulta para hacer * todo * de eso. – Matt

Respuesta

6

Aquí es una consulta para obtener el tiempo de establecimiento de la media y el tiempo de juego para cada juego, creo que sirve:

SELECT 
    gameName, 
    AVG(UNIX_TIMESTAMP(startPlay) - UNIX_TIMESTAMP(beginSetup)) AS setupTime, 
    AVG(UNIX_TIMESTAMP(gameEnd) - UNIX_TIMESTAMP(startPlay)) AS gameTime, 
    AVG(UNIX_TIMESTAMP(gameEnd) - UNIX_TIMESTAMP(beginSetup)) AS totalTime, 
FROM `table` 
GROUP BY gameName 
ORDER BY totalTime DESC; 

debe producir resultados similares a:

+----------+-----------+-----------+-----------+ 
| gameName | setupTime | gameTime | totalTime | 
+----------+-----------+-----------+-----------+ 
| chess | 1100.0000 | 1250.0000 | 2350.0000 | 
| checkers | 466.6667 | 100.5000 | 933.3333 | 
+----------+-----------+-----------+-----------+ 

que acaba de insertar unos 8 Examine las filas con algunos datos aleatorios para que mis números no tengan sentido, pero ese es el resultado que obtendría.

Tenga en cuenta que esto escaneará toda la tabla, por lo que podría tomar un tiempo según la cantidad de registros que tenga en esta tabla. Definitivamente es algo que desea ejecutar en segundo plano periódicamente si tiene una cantidad considerable de registros del juego.

+0

Esto está cerca pero me está dando algunos números impares y no puedo entender cómo se les está ocurriendo. Por ejemplo, tengo 'Juego 1' que tiene dos registros y estos tiempos: beginSetup (1) = 2012-07-25 12:06:03 gameEnd (1) = 2012-07-25 13:29:45 beginSetup (2) = 2012-08-01 12:06:30 gameEnd (2) = 2012-08-01 13:40:32. Cuando hago: 'code'SELECT GAMENAME, AVG (startPlay - beginSetup) AS SETUPTIME, AVG (gameEnd - startPlay) COMO TIEMPO DE JUEGO, AVG (gameEnd - beginSetup) AS totalTime FROM' table' GRUPO POR gameName ORDEN POR totalTime DESC; –

+0

Estaba pensando que sus valores eran marcas de tiempo de Unix. Intente convertir todas las veces a marcas de tiempo de Unix en la consulta. Ejemplo: 'SELECT gameName, AVG (UNIX_TIMESTAMP (startPlay) - UNIX_TIMESTAMP (beginSetup)) AS setupTime, AVG (UNIX_TIMESTAMP (gameEnd) - UNIX_TIMESTAMP (startPlay)) AS gameTime, AVG (UNIX_TIMESTAMP (gameEnd) - UNIX_TIMESTAMP (beginSetup)) AS totalTime , FROM table GROUP BY gameName ORDER BY totalTime DESC; ' – drew010

+0

La conversión a marcas de tiempo Unix hizo el truco. ¡Gracias un montón! –

1

para algo así como el tiempo que tomó para establecer que podría escribir algo como:

SELECT DATEDIFF(HOUR, BeginSetup, StartTime) -- in hours how long to set up 
Cuestiones relacionadas