2011-11-29 93 views
4

我有這樣的MySQL查詢:計算上最後一行的總持續時間在MySQL

SELECT CONCAT(u.lastname, ', ', u.firstname) AS Name, start.timestamp start, end.timestamp end, timediff(end.timestamp, start.timestamp) duration 
    from user u, user_group ug, (
    select *, (
     select event_id from event L2 where L2.timestamp>L1.timestamp and L2.user_bannerid=L1.user_bannerid order by timestamp limit 1 
    ) stop_id from event L1 
) start join event end on end.event_id=start.stop_id 
where start.status='In' and end.status='Out' and u.user_bannerid = start.user_bannerid and ug.user_bannerid = u.user_bannerid and ug.group_id = start.group_id 

它顯示是這樣的:

+----------------------------------------------------+---------------+ 
| Name | start    | end     | duration  |  
+----------------------------------------------------+---------------+ 
| User | 2011-11-24 02:12:05 | 2011-11-24 02:12:20 | 00:00:15  |  
| User | 2011-11-28 21:46:54 | 2011-11-28 21:53:01 | 00:06:17  | 
+----------------------------------------------------+---------------+ 

但我想最後一排顯示總持續時間數如下:

+----------------------------------------------------+---------------+ 
| Name | start    | end     | duration  |  
+----------------------------------------------------+---------------+ 
| User | 2011-11-24 02:12:05 | 2011-11-24 02:12:20 | 00:00:15  |  
| User | 2011-11-28 21:46:54 | 2011-11-28 21:53:01 | 00:06:17  | 
|  |      |      | 00:06:32  | 
+----------------------------------------------------+---------------+ 

有人可以幫我修改查詢,以顯示下一個持續時間的總和行?

+0

請注意,如果可能的話,這可能是由應用程序邏輯比數據庫查詢更好地處理的東西。 – mellamokb

+0

是的,它與@傑克的答案一起工作,即時通訊在vb.net的應用程序中登錄,以跟蹤學生在實驗室的總小時數。因此,管理員只需鍵入特定學生的用戶ID,然後將其所有日誌提取出來並顯示在底部....:D – user1012135

回答

1

我不是超級驕傲這個答案的,但它應該工作:

SELECT 0 as is_total, CONCAT(u.lastname, ', ', u.firstname) AS Name, start.timestamp start, end.timestamp end, timediff(end.timestamp, start.timestamp) duration 
    from user u, user_group ug, (
    select *, (
     select event_id from event L2 where L2.timestamp>L1.timestamp and L2.user_bannerid=L1.user_bannerid order by timestamp limit 1 
    ) stop_id from event L1 
) start join event end on end.event_id=start.stop_id 
where start.status='In' and end.status='Out' and u.user_bannerid = start.user_bannerid and ug.user_bannerid = u.user_bannerid and ug.group_id = start.group_id 

UNION 
SELECT 1, null, null, null, sum(duration) 
FROM 
(
    SELECT CONCAT(u.lastname, ', ', u.firstname) AS Name, start.timestamp start, end.timestamp end, timediff(end.timestamp, start.timestamp) duration 
     from user u, user_group ug, (
     select *, (
      select event_id from event L2 where L2.timestamp>L1.timestamp and L2.user_bannerid=L1.user_bannerid order by timestamp limit 1 
     ) stop_id from event L1 
    ) start join event end on end.event_id=start.stop_id 
    where start.status='In' and end.status='Out' and u.user_bannerid = start.user_bannerid and ug.user_bannerid = u.user_bannerid and ug.group_id = start.group_id 

) total 
ORDER BY is_total 
+0

您好, 現在它顯示BLOB持續時間欄。你知道什麼是錯的嗎? 謝謝 – user1012135

+1

去@Amado的答案 - 它好多了。 –

+0

謝謝,現在工作:D ...我只是不得不改變總和(持續時間)CAST(SUM(持續時間)AS時間) – user1012135

4

試一下這個效果:

mysql> select *, timediff(end, start) as diff, sec_to_time(SUM(timediff(end,start))) as sum FROM timet GROUP BY start WITH ROLLUP; 

+---------------------+---------------------+-------+----------+----------+ 
| start    | end     | g  | diff  | sum  | 
+---------------------+---------------------+-------+----------+----------+ 
| 2011-11-28 23:00:51 | 2011-11-28 23:00:56 | 0.678 | 00:00:05 | 00:00:05 | 
| 2011-11-28 23:00:52 | 2011-11-28 23:00:57 | f  | 00:00:05 | 00:00:05 | 
| 2011-11-28 23:00:53 | 2011-11-28 23:00:58 | 0.948 | 00:00:03 | 00:00:05 | 
| 2011-11-28 23:00:58 | 2011-11-28 23:01:01 | 0.153 | 00:00:03 | 00:00:03 | 
| NULL    | 2011-11-28 23:01:01 | 0.153 | NULL  | 00:00:18 | 
+---------------------+---------------------+-------+----------+----------+ 
5 rows in set (0.01 sec) 

MySQL的:
Group by, with rollup

+0

我有點困惑這是如何工作。是不是可以在最後一個之下顯示diff的總和? – user1012135

+0

是的,通過從select查詢中刪除diff列,您將只剩下sum列。我不知道爲什麼diff列在第3行顯示3秒,當它應該是5秒時,sum列包含正確的值。 WITH ROLLUP選項完全符合您的要求。它包含一行,其中包含每個組功能的列總數。 (_sum_)在這種情況下。 –

0

我會理想地將這種邏輯歸入第二個查詢或應用層。

但是試圖破譯你的查詢,盡我的能力,你可以嘗試,看看這樣的事情產生你想要什麼:

SELECT 
    CONCAT(u.lastname, ', ', u.firstname) AS Name, 
    start.timestamp AS start, 
    end.timestamp AS end, 
    TIME(SUM(TIMEDIFF(end.timestamp, start.timestamp))) AS duration 
FROM user AS u 
    INNER JOIN user_group AS ug ON u.user_bannerid = ug.user_bannerid 
    INNER JOIN event AS start ON start.user_bannerid = u.user_bannerid AND start.status='In' AND start.group_id = ug.group_id 
    INNER JOIN event AS end ON end.user_bannerid = u.user_bannerid AND end.status='Out' AND start.event_id = end.event_id 
GROUP BY start.event_id WITH ROLLUP 

http://dev.mysql.com/doc/refman/5.5/en/group-by-modifiers.html

編輯:只見那阿瑪多已回答有類似的解決方案,但覺得我的依然是相關的。

+0

Amando's不適合我...我認爲這是我需要的,但唯一的問題是結果不會顯示與該查詢,看起來像它缺少的東西,你能改寫它嗎? – user1012135

+0

我真的要在明天把它變成這樣,並會很感激任何幫助 – user1012135