2012-08-01 15 views
5

Gram w wiele gier planszowych i utrzymuję stronę/bazę danych, która śledzi kilka statystyk. Jedna z tabel śledzi różne czasy. Jest to struktura wygląda następująco:Zapytanie Mysql do średniego czasu

  • gamename (tekst - nazwa gry planszowej)
  • numPeople (int - liczba osób, które odegrały)
  • timeArrived (znacznik czasu - kiedy dotarliśmy do domu, w którym gramy)
  • beginSetup (znacznik czasu - czas, w którym zaczynamy konfigurację gry)
  • startPlay (znacznik czasu - czas możemy zacząć grę)
  • gameEnd (znacznik czasu - czas, gra jest zakończona)

Zasadniczo, co ja chce zrobić to użyć w tych czasach, aby uzyskać interesujące/przydatne informacje (jak na przykład, która gra zajmuje średnio najdłuższą konfigurację, która gra najdłużej trwa, jaka gra jest najdłuższa od przyjazdu do końca itd.). Normalnie, Opieram się o wiele za dużo na PHP i po prostu wybieram * ... i łapię cały czas, a następnie wykonuję obliczenia PHP, aby znaleźć wszystkie statystyki, ale wiem, że MySQL może to wszystko zrobić dla mnie z zapytaniem. Niestety, jestem dość zagubiony, jeśli chodzi o bardziej złożone zapytania, więc chciałbym pomóc.

Chciałbym podać kilka przykładów zapytań dla par i mam nadzieję, że uda mi się znaleźć inne średnie czasowe zapytania, gdy ktoś mnie uruchomi. Jak wyglądałoby zapytanie o najdłuższy czas gry planszowej? A co z najszybszą grą/czasem na skonfigurowanie?

Dodatkowe informacje: drew010 - Masz dobry start, ale nie osiągam oczekiwanych rezultatów. Dałam ci kilka prawdziwych przykładów ... Mam grę o nazwie Harper i została ona zagrana dwa razy (więc w bazie danych znajdują się dwa rekordy z czasem). Oto co czasy wygląda na to:

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 

Kiedy następnie uruchomić kwerendę mi dostarczone (i przekonwertować sekund na godziny/minuty/sekundy) uzyskać te wyniki (przepraszam, nie wiem wiesz jak to zrobić fajne tabelę DID):

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

od liczb, średni całkowity czas powinny wynosić około 1 godzinę i 24 minut - nie 3 godziny i 34 minut. Masz pomysł, dlaczego otrzymam nieprawidłowe numery?

+0

Nie można odpowiedzieć bez znajomości co tabele wyglądać. W przeciwnym razie rzucamy lotkami w ciemność. –

+0

"[Najdłuższy czas średnio"? Nie jestem pewien, czy podążam. Jak oceniasz "najdłuższy czas", jeśli nie masz podgrup, z których można pobrać "najdłuższe czasy"? – Palladium

+0

@Palladium Myślę, że OP chce kwerendy zrobić * wszystko * tego. – Matt

Odpowiedz

6

Oto zapytanie, aby uzyskać średni czas konfiguracji i czas odtwarzania dla każdej gry, nadzieję, że to pomaga:

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; 

powinna przynieść rezultaty podobne do:

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

prostu włożony około 8 testuj wiersze z pewnymi losowymi danymi, więc moje liczby nie mają sensu, ale to jest wynik, który otrzymasz.

Należy zwrócić uwagę, że spowoduje to przeskanowanie całego stołu, co może trochę potrwać, w zależności od liczby rekordów w tej tabeli. Jest to zdecydowanie coś, co chcesz uruchomić w tle okresowo, jeśli masz znaczną ilość rekordów gry.

+0

To jest bliskie, ale daje mi kilka liczb nieparzystych i nie mogę się zorientować, jak sobie z nimi poradzi. Na przykład mam "Game 1", która ma dwie płyty i te czasy: 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. Kiedy zrobić: 'code'SELECT gamename AVG (startPlay - beginSetup) AS setupTime, AVG (gameEnd - startPlay) AS GameTime, AVG (gameEnd - beginSetup) AS totalTime FROM' table' GROUP BY gameName ORDER BY totalTime DESC; –

+0

Myślałem, że twoje wartości to unixowe znaczniki czasu. Spróbuj przekonwertować wszystkie czasy na uniksowe znaczniki czasu w zapytaniu. Przykład: SELECT nazwa gry, 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 , Z tabeli GROUP BY gameName ORDER BY totalTime DESC; ' – drew010

+0

Konwersja do znaczników czasowych uniks zrobiła lewę. Wielkie dzięki! –

1

na coś takiego jak długo zajęło założyć można napisać coś takiego:

SELECT DATEDIFF(HOUR, BeginSetup, StartTime) -- in hours how long to set up 
Powiązane problemy