2012-08-01 106 views
5

我玩很多棋盤遊戲,我維護一個網站/數據庫,它跟蹤幾個統計數據。其中一張桌子跟蹤不同時間。它的結構是這樣的:Mysql查詢到平均時間

  • gameName(文字 - 棋盤遊戲的名稱)
  • numPeople(INT - 那玩的人數)
  • timeArrived(時間戳 - 當我們到達我們正在玩遊戲的房子時)
  • beginSetup(時間戳 - 我們開始設置遊戲的時間)
  • startPlay(時間戳 - 我們真正開始玩遊戲的時間) -

基本上,我想要做的是使用

  • gameEnd(遊戲結束的時間時間戳)這些時間從一些有趣/有用的信息(比如平均需要最長時間設置的遊戲,平均需要最長時間玩什麼遊戲,從遊戲到結束遊戲最長等等)。通常情況下,我太依賴於PHP,我只是做一個select * ...並抓住所有的時間,然後做一些PHP計算來查找所有的統計信息,但是我知道MySQL可以爲查詢做到這一切。不幸的是,當涉及到更復雜的查詢時,我會迷失方向,所以我想要一些幫助。

    我想要舉幾個查詢的例子,並希望一旦有人讓我開始,我可以計算出其他平均時間查詢。平均來說,查詢長時間玩棋盤遊戲會是什麼樣子?平均設置最快的遊戲/時間是什麼?

    附加信息: drew010 - 你讓我有一個好的開始,但我沒有得到我期望的結果。我已經給你一些真正的實例... 我有一個名爲哈珀的遊戲,它已被玩過兩次(所以有兩個記錄在數據庫中的時間entires)。這是時代的樣子吧:

    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 
    

    當我再運行你爲我提供的查詢(和我的秒轉換成小時/分/秒),我得到這些結果(對不起,我不知道該怎麼做,你做了冷靜表):

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

    從數字,平均總時間應該是約1小時24分鐘 - 不是3小時34分鐘。任何想法爲什麼我會得到不正確的數字?

  • +0

    不能回答你不知道你的表是什麼樣子。否則,我們只是在黑暗中投擲飛鏢。 – 2012-08-01 20:22:59

    +0

    「平均時間最長」?我不確定我是否遵守。如果你沒有小組從「最長時間」中獲取「平均時間」,你如何取得平均值? – Palladium 2012-08-01 20:24:39

    +0

    @鈀我認爲OP想要一個查詢來完成*全部*。 – Matt 2012-08-01 20:27:38

    回答

    6

    下面是一個查詢,以獲得平均安裝時間和播放時間爲每場比賽,希望它有助於:

    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; 
    

    應該產生類似的結果:

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

    我剛插入約8用一些隨機數據測試行,所以我的數字沒有意義,但這是你會得到的結果。

    請注意,這將掃描您的整個表,因此可能需要一段時間,具體取決於您在此表中有多少條記錄。如果您有相當多的遊戲記錄,這絕對是您想要定期在後臺運行的東西。

    +0

    這很接近,但它給了我一些奇數,我無法弄清楚它是如何與他們聯繫的。例如,我有'遊戲1',它有兩個記錄,這些時間: 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。 當我做: 'code'SELECT gameName,AVG(startPlay - beginSetup)AS setupTime, AVG(gameEnd - startPlay)AS gameTime, AVG(gameEnd - beginSetup)AS TOTALTIME, FROM'table' GROUP按遊戲名稱 ORDER BY totalTime DESC; – 2012-08-06 19:36:20

    +0

    我在想你的價值是unix時間戳。嘗試將所有時間轉換爲查詢中的unix時間戳。示例:'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表GROUP BY遊戲名稱ORDER BY totalTime DESC; ' – drew010 2012-08-06 19:47:29

    +0

    轉換爲unix時間戳的技巧。謝謝一堆! – 2012-08-08 18:35:52

    1

    這樣的事情過了多長時間來建立你可以寫這樣的:

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