我有一个选择一组用户的查询。每个用户都可以拥有一个号码 与之相关的事件。我想加入每个用户最早的活动 与该用户关联(每个用户产生一行),并在单个查询中执行此操作。
所以,我有点想这样做:
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")
但在联接选择中引用“用户”是违法的。
答案 0 :(得分:2)
您可以使用子查询获取每个min(start_time)
的{{1}}。然后,您将使用此结果连接回user_id
表以获取min事件的详细信息:
events
如果您使用的数据库能够应用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
,那么您可以使用以下内容:
row_number()
答案 1 :(得分: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不支持此功能,但大多数其他数据库都支持(并且您没有指定您正在使用的数据库)。