2011-12-05 64 views
0

试图想想如何概括我的问题,只是想不到的东西(这也许是为什么我googling没有提供解决方案呢)。SQL获取每个用户的最新记录

所以我把我的问题在users表和comments表而言,我想要得到的最近评论为每个用户

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

克里斯感谢 - 我会看看这个。 (我的用户/评论的事情是真实的情况simplfication - 在现实中我处理的时间字段),我要让你知道如何去。 – blogofsongs

0

再次感谢克里斯 - 我认为你的方法,但最终我以我把我原来的SQL的形式给出看了一遍。我的问题中包含的SQL大大简化了。实际上,我有三个连接,并且在where子句中相当大。

我发现相关的子查询方法实际上是非常快的,当我仔细查看where子句时,并且当我确定子查询与外部查询相关时,它在结果集上这样做是通过过滤大大减少。

相关问题