0

我有一个选择一组用户的查询。每个用户可以有许多与之关联的事件。我想将每个用户加入与该用户关联的最早事件(导致每个用户一行),并在单个查询中这样做。

所以,我有点想这样做:

SELECT * FROM users
  left join (
    select * from events where events.user_id = users.id
    order by start_time limit 1) as event
    ON ("event"."user_id" = "users"."id")

但是在加入的选择中引用“用户”是非法的。

4

2 回答 2

2

您可以使用子查询来获取min(start_time)for each user_id。然后,您将使用此结果连接回events表以获取 min 事件的详细信息:

SELECT * 
FROM users u 
LEFT JOIN 
(
  SELECT Min(start_time) Min_Start, user_id 
  FROM events 
  GROUP BY user_id
) e1 
   ON u.id = e1.user_id 
LEFT JOIN events e2 
 ON e1.user_id = e2.user_id 
 AND e1.min_start = e2.start_time 

如果您使用的数据库能够应用 a row_number(),那么您可以使用以下内容:

select *
from
(
  SELECT *, 
    row_number() over(partition by e.user_id order by start_time) rn
  FROM users u 
  LEFT JOIN events e 
   ON u.id = e.user_id 
) src
where rn = 1
于 2013-01-27T19:23:08.227 回答
1

在大多数数据库中,您可以使用row_number()

SELECT *
FROM users u left join
     (select e.*, row_number() over (partition by e.user_id order by start_time) seqnum
      from events e
     ) e
     on e.user_id = u.id

MySQL 和 MS Access 不支持此功能,但大多数其他数据库支持(并且您没有指定您使用的数据库)。

于 2013-01-27T19:26:45.740 回答