我有两个表,如下所示,我试图在一个SQL查询中获取参与者的时间(finish_time - start_time)。请注意,需要从名为race_events的关联表的happe_at列中检索开始时间和结束时间。
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"
这让我大部分时间都在为每个参与者提供包含开始和结束时间的结果:
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 :(得分: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
答案 1 :(得分: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'
答案 2 :(得分: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列。