0

ユーザーのセットを選択するクエリがあります。各ユーザーは、それに関連付けられたイベントの数を持つことができます。各ユーザーを、そのユーザーに関連付けられている最も早いイベント(ユーザーごとに1つの行になります)に結合し、単一のクエリ内で結合したいと思います。

だから、私はこれをやりたいと思っています:

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)、それぞれのを取得できますuser_id。次に、この結果を使用してテーブルに結合し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()、次を使用できます。

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とMSAccessはこの機能をサポートしていませんが、他のほとんどのデータベースはサポートしています(使用しているデータベースを指定しません)。

于 2013-01-27T19:26:45.740 に答える