2013-04-20 39 views
0

我有兩個表,如下所示,我試圖在一個SQL查詢中獲取參與者的時間(finish_time - start_time)。請注意,開始時間和結束時間需要從名爲race_events的關聯表的occurrence_at列中檢索。SQL檢索並執行關聯表的值算術

PARTICIPANTS 
    id | membership_id | race_id 
------+---------------+--------- 
1133 |   547 |  690 
1121 |   342 |  690 


RACE_EVENTS 
    id | participant_id | event_type | occurred_at 
------+----------------+------------+--------------- 
1075 |   1121 | start  | 1366249860579 
1077 |   1121 | finish  | 1366249968936 
1104 |   1133 | start  | 1366250760128 
1107 |   1133 | finish  | 1366250876237 

我無法弄清楚如何實現這一目標使用連接,因此我解決了使用子查詢,像這樣的問題:

SELECT 
(select occurred_at from race_events where participant_id = participants.id and event_type = 'start') as started_at, 
(select occurred_at from race_events where participant_id = participants.id and event_type = 'finish') as finished_at, 
participants.* FROM "participants" 

這引起了我的大部分有yeilding包含啓動結果的方式和結束時間爲每個參與者:

started_at | finished_at | id | membership_id | race_id 
---------------+---------------+------+---------------+--------- 
1366250760128 | 1366250876237 | 1133 |   547 |  690 
1366249860579 | 1366249968936 | 1121 |   342 |  690 

理想的情況下,雖然我想也計算race_time(finished_at - started_at)在此查詢過,所以結果看起來像但是有一個名爲race_time的額外列,其中包含該行的(finished_at - started_at)的結果。任何人都可以建議我怎麼做?

在相關說明中,我不相信使用子查詢來獲取關聯值的一般方法是最乾淨或最有效的,我非常感謝其他建議。

我使用的是PostgreSQL,但我懷疑答案對任何SQL數據庫都是一樣的。

在此先感謝。

+0

你爲什麼要這樣處理比賽?開始和結束應該在同一記錄中。完成時更新它。 – Yatrix 2013-04-20 20:02:01

+0

我知道你的意思。在我們的案例中,「開始」和「完成」不是我們必須處理的唯一競賽事件,不同類型的比賽有不同類型的事件,如轉換和拆分。我們不太確定未來將需要什麼類型的事件,這就是我爲什麼這樣做的原因。 – Bruce 2013-04-20 20:24:10

回答

1

試試這一個,但被勸我還沒有嘗試它,它可能有一些語法錯誤,但你應該明白了吧

SELECT 
    re1.occured_at as started_at, 
    re2.occured_at as finished_at, 
    (re2.occured_at - re1.occured_at) as race_time, 
    p.id, 
    p.membership_id, 
    p.race_id 

participant_id FROM PARTICIPANTS p 
INNER JOIN RACE_EVENTS re1 ON re1.participant_id = p.id AND re1.event_type = 'start' 
INNER JOIN RACE_EVENTS re2 ON re2.participant_id = p.id AND re2.event_type = 'finish' 
+0

非常感謝Dan和mcl。這是一個更好的方法,並且完美地工作。你的答案基本上都是一樣的,希望我可以將兩者都標記爲正確。我不知道連接可以這樣命名,學到了新的東西。再次感謝。 – Bruce 2013-04-20 20:20:24

1

你需要加入到race_events兩次

select somefields, finished.occurred_at - started.occurred_at duration 
from participants p join race_events started on p.race_id = started.race_id 
and event_type = 'start' 
join race_events finished on p.race_id = started.race_id 
and event_type = 'finish' 
where whatever 
0
select 
    started_at, finished_at, 
    finished_at - started_at race_time, 
    p.id, p.membership_id, p.race_id 
from 
    participants p 
    inner join 
    race_events res on p.id = res.participant_id 
    inner join 
    race_events ref on p.id = ref.participant_id 
where 
    res.event_type = 'start' 
    and ref.event_type = 'finish' 

我認爲你的模型不好,你在race_events表中缺少一個競賽表和race_id。

+0

謝謝。爲了示例的目的,我簡化了這個數據結構,所以有一些缺失。 – Bruce 2013-04-21 00:47:33