2011-12-05 14 views
0

私の質問を一般化する方法を考えて、何かを考えることができませんでした(なぜ私はグーグルがまだ解決策を提供していない理由です)。SQLは、各ユーザーの最新のレコードを取得する

だから、私は、各ユーザーの最新COMMENT を取得したいUSERSテーブルとコメントテーブルの面で、私の質問を入れています。

USERS私はこのような何かを試してみた

| ID | NAME | 
------------- 
| 01 | BOB | 
------------- 
| 02 | JEN | 
------------- 

コメント

| EMP_ID | UPDATED | 
----------------------- 
| 01  | 12/05/2011 | <== I WANT THIS 
----------------------- 
| 01  | 11/29/2011 | 
----------------------- 
| 02  | 12/01/2011 | <== ...AND THIS 
----------------------- 
| 02  | 11/27/2011 | 

...

select e.date from USERS u 
join EMPLOYEES e on e.emp_id=u.id 
where emp_id in (select emp_id from TIMESHEETS where emp_id=u.id order by date fetch first 1 row only) 

...それは動作しますが、恐ろしく遅いです。

(私たちは、DB2を使用しているので、私は私達の処分で共通のテーブルを持っている)

+0

**コードやXMLやデータサンプルを投稿する場合は、テキストエディタでこれらの行を強調表示し、エディタツールバーの "コードサンプル"ボタン( '{}')をクリックすると、それ! –

+2

[SQL - グループ内の最大の要素を選択]の可能な複製(http://stackoverflow.com/questions/7538725/sql-select-n-greatest-elements-in-group) –

答えて

1
select u.name 
    , u.id 
    , c.text 
    , c.updated 
    from users u 
left 
    join (select cm.emp_id 
       , max(cm.updated) mostRecentCommentDate 
      from comments cm 
      group 
      by cm.emp_id) recentComments 
    on recentComments.emp_id = u.id 
left 
    join comments c 
    on c.emp_id = u.id 
    and c.updated = recentComments.mostRecentCommentDate 

ユーザーがthier最新のコメントと同じ日に複数のコメントがある場合、ここで潜在的な問題があります。これは解決できますが、目的の行を決定する方法の基準を提供する必要があります。上記のクエリは、最新のコメント日付の各コメントの行を与えます。あまりにもそれは日時フィールドではない...

+0

Chris thanks - 私はこれを見てください。 (私のUSERS/COMMENTSは実際の状況を単純化したものですが、実際にはdatetimeフィールドを扱っています!) – blogofsongs

0

おかげで再びクリス - 私はあなたのアプローチを考えたが、私は元のSQLで取ったaproachをもう一度見た。私の質問に含まれるSQLは大幅に簡素化されました。実際には私は3つの結合とかなり大きなwhere節を持っています。

whereサブクエリが外側のクエリと相関している場所を確認したときに、相関サブクエリのアプローチが実際には非常に高速だったことがわかりました。フィルタリングによって大幅に削減されました。

関連する問題