2016-11-15 91 views
1

表地點:總和MySQL的結果爲每對

+----+-----------+-----------+---------------------+ 
| Id | Old Value | New Value |  Date   | 
+----+-----------+-----------+---------------------+ 
| 1 | Home  | Work  | 2016-11-01 09:00:00 | 
| 2 | Work  | Home  | 2016-11-01 09:25:00 | 
| 3 | Home  | Work  | 2016-11-01 09:44:59 | 
| 4 | Work  | Home  | 2016-11-01 10:11:50 | 
| 5 | Home  | Work  | 2016-11-01 10:25:30 | 
| 6 | Work  | Home  | 2016-11-01 11:01:15 | 
+----+-----------+-----------+---------------------+ 

我的查詢:

SELECT loc1.*,loc2.date AS loc2_date, SUM(CAST(TIMESTAMPDIFF(MICROSECOND,loc1.date,loc2.date)/1000000 AS DECIMAL(20))) AS time_diff 
FROM locations AS loc1 
     LEFT JOIN locations AS loc2 ON loc1.old_value=loc2.new_value AND loc2.id > loc1.id 
     WHERE old_value="Home" 

我的查詢結果:

Id: 1 
Old Value: Home 
New Value: Work 
Date: 2016-11-01 09:00:00 
Loc2_date: 2016-11-01 09:25:00 
Time_fidd: 1500 

Id: 1 
Old Value: Home 
New Value: Work 
Date: 2016-11-01 09:00:00 
Loc2_date: 2016-11-01 10:11:50 
Time_diff: 4310 

Id: 1 
Old Value: Home 
New Value: Work 
Date: 2016-11-01 09:00:00 
Loc2_date: 2016-11-01 11:01:15 
Time_diff: 7275 

Id: 3 
Old Value: Home 
New Value: Work 
Date: 2016-11-01 09:44:59 
Loc2_date: 2016-11-01 10:11:50 
Time_diff: 1611 

Id: 3 
Old Value: Home 
New Value: Work 
Date: 2016-11-01 09:44:59 
Loc2_date: 2016-11-01 11:01:15 
Time_diff: 4576 

Id: 5 
Old Value: Home 
New Value: Work 
Date: 2016-11-01 10:25:30 
Loc2_date: 2016-11-01 11:01:15 
Time_diff: 2145 

我想總結的日期來查看所有秒我之前在工作。如果我按ID分組將顯示我需要的確切數據,但是當我總結loc1.dateloc2.date之間的差異時,查詢將跳過group by並繼續返回所有行。請幫忙。

我從我的查詢需要什麼:

Id: 1 
Old Value: Home 
New Value: Work 
Date: 2016-11-01 09:00:00 
Loc2_date: 2016-11-01 09:25:00 
Time_fidd: 1500 

Id: 3 
Old Value: Home 
New Value: Work 
Date: 2016-11-01 09:44:59 
Loc2_date: 2016-11-01 10:11:50 
Time_diff: 1611 

Id: 5 
Old Value: Home 
New Value: Work 
Date: 2016-11-01 10:25:30 
Loc2_date: 2016-11-01 11:01:15 
Time_diff: 2145 

回答

1

更新

試試這個。

SELECT tablea.id, tablea.`Old_value`, tablea.`New_value`, tablea.`Date`, tablea.`Date` Loc2_date, SUM(tablea.time_diff) AS time_diff 
FROM 
(
    SELECT loc1.`id`, loc1.`Old_value`, loc1.`New_value`, loc1.`Date`, loc2.`Date` Loc2_date, CAST(ABS(TIMESTAMPDIFF(MICROSECOND, loc2.date, loc1.date)/1000000) AS DECIMAL(20)) time_diff 
    FROM locations loc1 INNER JOIN locations loc2 
    ON loc1.`Old_value`=loc2.`New_value` AND loc2.`id`>loc1.`id` 
    WHERE loc1.`Old_value`="Home" 
    GROUP BY loc1.`id` 
) tablea  

例子:

SELECT tableb.* 
FROM 
(
    SELECT tablea.id, tablea.`Old_value`, tablea.`New_value`, tablea.`Date`, tablea.`Date` Loc2_date, SUM(tablea.time_diff) AS time_diff 
    FROM 
    (
     SELECT loc1.`id`, loc1.`Old_value`, loc1.`New_value`, loc1.`Date`, loc2.`Date` Loc2_date, CAST(ABS(TIMESTAMPDIFF(MICROSECOND, loc2.date, loc1.date)/1000000) AS DECIMAL(20)) time_diff 
     FROM locations loc1 INNER JOIN locations loc2 
     ON loc1.`Old_value`=loc2.`New_value` AND loc2.`id`>loc1.`id` 
     WHERE loc1.`Old_value`="Home" 
     GROUP BY loc1.`id` 
    ) tablea  
) tableb 

老答案。

您可以試試group_by爲此。在WHERE條款後面添加GROUP BY loc1.id

SELECT loc1.*,loc2.date AS loc2_date, SUM(CAST(TIMESTAMPDIFF(MICROSECOND,loc1.date,loc2.date)/1000000 AS DECIMAL(20))) 
FROM locations AS loc1 
LEFT JOIN locations AS loc2 ON loc1.old_value=loc2.new_value AND loc2.id > loc1.id 
WHERE old_value="Home" 
GROUP BY loc1.id 
+0

這是行不通的,MySQL將返回所有的組合將總結所有:(我已經試過將左連接,內連接,和子查詢 –

+0

仍然無法工作,我需要SUM(CAST( ABS(TIMESTAMPDIFF(MICROSECOND,loc2.date,loc1.date)/ 1000000)AS DECIMAL(20)))。Mysql只需要返回一行SUM謝謝你試圖幫助我 –

+0

不能使用FROM子查詢這個查詢將會是一個子查詢 –