如何查找每组数据的最新行

时间:2010-05-13 02:08:05

标签: mysql date group-by aggregate database-partitioning

我有一个棘手的问题,我正试图找到最有效的方法来解决。

这是我的View结构的简化版本。


表:审核

AuditID | PublicationID | AuditEndDate | AuditStartDate
1       | 3             | 13/05/2010   | 01/01/2010
2       | 1             | 31/12/2009   | 01/10/2009
3       | 3             | 31/03/2010   | 01/01/2010
4       | 3             | 31/12/2009   | 01/10/2009
5       | 2             | 31/03/2010   | 01/01/2010
6       | 2             | 31/12/2009   | 01/10/2009
7       | 1             | 30/09/2009   | 01/01/2009 

我需要3个查询。我需要一个来获取所有数据。接下来只获取历史数据(即,除了通过AuditEndDate排除最新数据项之外的所有内容),然后最后一个查询是获取最新数据项(通过AuditEndDate)。

我有一个额外的复杂层,我有一个日期限制(这是基于每个用户/组),某些用户组只能在某些日期之间查看。您会在where子句中注意到这一点,因为AuditEndDate< = blah和AuditStartDate> = blah

Foreach发布,选择所有可用数据。

select * from Audits
Where auditEndDate<='31/03/10' and AuditStartDate>='06/06/2009';

Foreach发布,选择所有数据但排除可用的最新数据(通过AuditEndDate)

select * from Audits 
left join 
(select AuditId as aid, publicationID as pid
   and max(auditEndDate) as pend 
 from Audit where auditenddate <= '31/03/2009' /* user restrict */
 group by pid) Ax 
on Ax.pid=Audit.pubid
where pend!=Audits.auditenddate
AND auditEndDate<='31/03/10' 
and AuditStartDate>='06/06/2009' /* user restrict */

Foreach发布,仅选择可用的最新数据(通过AuditEndDate)

select * from Audits 
left join 
  (select AuditId as aid, publicationID as pid
    and max(auditEndDate) as pend 
   from Audit where auditenddate <= '31/03/2009'/* user restrict */
   group by pid) Ax 
on Ax.pid=Audit.pubid
where pend=Audits.auditenddate
AND auditEndDate<='31/03/10' 
and AuditStartDate>='06/06/2009' /* user restrict */

所以目前,查询1和3工作正常,但查询2只返回所有数据而不是限制。

任何人都可以帮助我吗?

由于

杰森

1 个答案:

答案 0 :(得分:0)

好的,实际上......那些查询工作正常。这是我的条件PHP运行它们。 一切都很好:))

任何人都可以建议一个更有效的方法,虽然我有兴趣听到这个。我最初在where子句中使用了子查询,这个运行速度非常慢......从2秒开始它变为50秒....