2017-01-22 101 views
1

我想根據時間間隔從mysql數據庫中聚合一個屬性。下面是我的一些示例數據的數據結構:按時間彙總

事件表

+----+---------------------+---------------------+ 
| id |  start  |   end   | 
+----+---------------------+---------------------+ 
| 1 | 2017-01-22 14:00:00 | 2017-01-22 17:00:00 | 
| 2 | 2017-01-22 15:00:00 | 2017-01-22 18:00:00 | 
+----+---------------------+---------------------+ 

預訂表

+----+----------+--------------+--------+ 
| id | event_id | person_count | status | 
+----+----------+--------------+--------+ 
| 1 |  1 |   5 |  1 | 
| 2 |  1 |   4 |  1 | 
| 3 |  1 |   6 |  1 | 
| 4 |  2 |   3 |  1 | 
| 5 |  2 |   4 |  1 | 
| 6 |  2 |   5 |  0 | 
+----+----------+--------------+--------+ 

我正在尋找一種方法來找出有多少人( SUM的bookings.person_count)在預訂狀態爲1的15分鐘時間間隔內參加事件。因此,查詢的輸出應該如下所示:

+---------------------+--------------------+ 
|  date   | person_count_total | 
+---------------------+--------------------+ 
| 2017-01-22 14:00:00 |     15 | 
| 2017-01-22 14:15:00 |     15 | 
| 2017-01-22 14:30:00 |     15 | 
| 2017-01-22 14:45:00 |     15 | 
| 2017-01-22 15:00:00 |     22 | 
| 2017-01-22 15:15:00 |     22 | 
| 2017-01-22 15:30:00 |     22 | 
| 2017-01-22 15:45:00 |     22 | 
| 2017-01-22 16:00:00 |     22 | 
| 2017-01-22 16:15:00 |     22 | 
| 2017-01-22 16:30:00 |     22 | 
| 2017-01-22 16:45:00 |     22 | 
| 2017-01-22 17:00:00 |     22 | 
| 2017-01-22 17:15:00 |     7 | 
| 2017-01-22 17:30:00 |     7 | 
| 2017-01-22 17:45:00 |     7 | 
| 2017-01-22 18:00:00 |     7 | 
+---------------------+--------------------+ 

有什麼辦法可以在mysql中實現這個嗎?當前的解決方案在php應用程序的第一次啓動和最後一次結束之間的所有15分鐘間隔內循環。但是,由於這會產生很多數據點,並且性能不佳,因爲每個數據點意味着一個查詢。

+0

「這會創建大量的數據點」。 。 。你不想要所有數據點的數據嗎?你如何避免這種情況? –

+0

我的意思是通過php腳本創建數據的成本很高。因爲每個數據點意味着一個查詢。 – lasagne

+0

你在17:00總結不正確,應該是22.因爲1和2都出現在那個時候@lasagne – GurV

回答

1

生成日期間行,然後讓與預訂表,像這樣一個JOIN:

SELECT 
    t.date, 
    SUM(CASE 
     WHEN b.status = 1 THEN person_count 
    END) person_count_total 
FROM 
    bookings b 
     INNER JOIN 
    events e ON b.event_id = e.id 
     INNER JOIN 
    (SELECT 
     (SELECT 
        MIN(start) 
       FROM 
        events) + INTERVAL 15 * (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a)) MINUTE AS Date 
    FROM 
     (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a 
    CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b 
    CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c 
    CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS d 
) t ON t.date BETWEEN e.start AND e.end 
GROUP BY t.date 
; 

萬一分鐘和事件最大日期之間的差異較大,你可以簡單的添加另一個交叉連接以適應更多的範圍,並添加一個10000 * e.a ..等等

+---------------------+--------------------+ 
| date    | person_count_total | 
+---------------------+--------------------+ 
| 2017-01-22 14:00:00 | 15     | 
+---------------------+--------------------+ 
| 2017-01-22 14:15:00 | 15     | 
+---------------------+--------------------+ 
| 2017-01-22 14:30:00 | 15     | 
+---------------------+--------------------+ 
| 2017-01-22 14:45:00 | 15     | 
+---------------------+--------------------+ 
| 2017-01-22 15:00:00 | 22     | 
+---------------------+--------------------+ 
| 2017-01-22 15:15:00 | 22     | 
+---------------------+--------------------+ 
| 2017-01-22 15:30:00 | 22     | 
+---------------------+--------------------+ 
| 2017-01-22 15:45:00 | 22     | 
+---------------------+--------------------+ 
| 2017-01-22 16:00:00 | 22     | 
+---------------------+--------------------+ 
| 2017-01-22 16:15:00 | 22     | 
+---------------------+--------------------+ 
| 2017-01-22 16:30:00 | 22     | 
+---------------------+--------------------+ 
| 2017-01-22 16:45:00 | 22     | 
+---------------------+--------------------+ 
| 2017-01-22 17:00:00 | 22     | 
+---------------------+--------------------+ 
| 2017-01-22 17:15:00 | 7     | 
+---------------------+--------------------+ 
| 2017-01-22 17:30:00 | 7     | 
+---------------------+--------------------+ 
| 2017-01-22 17:45:00 | 7     | 
+---------------------+--------------------+ 
| 2017-01-22 18:00:00 | 7     | 
+---------------------+--------------------+ 
+0

謝謝你的回答!有用。 – lasagne