0

我有两个表,如下所示,我试图在一个 sql 查询中获取参与者的时间(finish_time - start_time)。请注意,开始时间和结束时间需要从名为race_events 的关联表的发生_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 数据库的答案都是一样的。

提前致谢。

4

3 回答 3

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
于 2013-04-20T19:52:56.573 回答
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'
于 2013-04-20T19:56:14.543 回答
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 列。

于 2013-04-20T20:19:08.927 回答