2011-10-05 50 views
1

MySQL problem加入的行數總和

這是當前的表格佈局。

  • 有3個支腿
  • 每個腿有2點,其中is_start = 1是腿的開始,和is_start是腿的端部。
  • 當用戶在某個點登記時,會創建points_user中的條目。

在這個應用程序中,您有多個腿有2個點,其中一個標記腿的起點,另一個標記腿的末端。所以用戶(id = 2)Leg(id = 1)的總和爲points_userscreated其中points_usersleg_id = 1和points_usersuser_id = 2和points_usersis_start = 0減去points_users,其中is_start = 1(其他參數保持不變)。這只是一條腿。

我想什麼是總結了每種腿,我們得到這樣的數據的時間差:

| User.id | User.name | total_time | 
| 1  | John  | 129934  | 

任何人都知道我可以加入這些表和概括起來由用戶進行分組?

(不,這不是功課)

至於我:

SELECT 
(`end_time` - `start_time`) AS `diff` 
FROM 
(
    SELECT SUM(UNIX_TIMESTAMP(`p1`.`created`)) AS `start_time` 
    FROM `points_users` AS `pu1` 
    LEFT JOIN `points` AS `p1` ON `pu1`.`point_id` = `p1`.`id` 
    WHERE `p1`.`is_start` = 1 
) AS `start_time`, 
(
    SELECT SUM(UNIX_TIMESTAMP(`pu2`.`created`)) AS `end_time` 
    FROM `points_users` AS `pu2` 
    LEFT JOIN `points` AS `p2` ON `pu2`.`point_id` = `p2`.`id` 
    WHERE `p2`.`is_start` = 0 
) AS `end_time` 
+4

作業?聽起來像它!另外,你能指定你的表的主鍵嗎?這有助於理解如何獲得「正確」的解決方案。 – Romain

+1

你又試過了什麼? –

+1

@Romain:呵呵,希望我再次成爲那個年輕人。 – fortysixandtwo

回答

0

試試這個:

select users.user_id, 
    users.user_name, 
    SUM(timeDuration) totalTime 
from users 
join (
    select 
     pStart.User_id, 
     pStart.leg_id, 
     (pEnd.created - pStart.created) timeDuration     
    from (select pu.user_id, pu.leg_id, pu.created 
     from points_users pu 
     join points p on pu.id = p.point_id and pu.leg_id = p.leg_id 
     where p.is_start = 1) pStart 
    join (select pu.user_id, pu.leg_id, pu.created 
     from points_users pu 
     join points p on pu.id = p.point_id and pu.leg_id = p.leg_id 
     where p.is_start = 0) pEnd 
    on  pStart.user_id = pEnd.user_id 
    and  pStart.leg_id = pEnd.leg_id 
    ) tt 
on users.user_id = tt.user_id 
group by users.user_id, users.user_name 

子查詢得到持續時間爲每個用戶/腿,然後主查詢總結他們爲每一個用戶的所有分支。

0

編輯:增加了points表,現在我可以看到你在查詢嘗試。

最簡單的方法是加入points_users本身:

select leg_start.user_id, sum(leg_end.created - leg_start.created) 
from points_users leg_start 
join points_users leg_end on leg_start.user_id = leg_end.user_id 
    and leg_start.leg_id = leg_end.leg_id 
join points point_start on leg_start.point_id = point_start.id 
join points point_end on leg_end.point_id = point_end.id 
where point_start.is_start = 1 and point_end.is_start = 0 
group by leg_start.user_id 

有些人喜歡把那些is_start過濾器在連接條件,但因爲它是一個內部聯接這主要只是風格點。如果它是外連接,那麼將它們從WHERE移到連接可能會對結果產生影響。