合并查询到一个查询

问题描述:

我有以下两个表(带一些样本DATAS)合并查询到一个查询

日志:

 
ID | SETID | DATE 
======================== 
1 | 1 | 2010-02-25 
2 | 2 | 2010-02-25 
3 | 1 | 2010-02-26 
4 | 2 | 2010-02-26 
5 | 1 | 2010-02-27 
6 | 2 | 2010-02-27 
7 | 1 | 2010-02-28 
8 | 2 | 2010-02-28 
9 | 1 | 2010-03-01 

STATS:

 
ID | OBJECTID | FREQUENCY | STARTID | ENDID 
============================================= 
1 | 1  | 0.5  | 1 | 5 
2 | 2  | 0.6  | 1 | 5 
3 | 3  | 0.02 | 1 | 5 
4 | 4  | 0.6  | 2 | 6 
5 | 5  | 0.6  | 2 | 6 
6 | 6  | 0.4  | 2 | 6 
7 | 1  | 0.35 | 3 | 7 
8 | 2  | 0.6  | 3 | 7 
9 | 3  | 0.03 | 3 | 7 
10 | 4  | 0.6  | 4 | 8 
11 | 5  | 0.6  | 4 | 8 
7 | 1  | 0.45 | 5 | 9 
8 | 2  | 0.6  | 5 | 9 
9 | 3  | 0.02 | 5 | 9 

每天都有新的日志上不同的分析对象集并存储在表LOGS中。 在其他进程中,将对包含在这些集合中的对象计算一些统计信息,并将结果存储在表STATS中。这些统计数据是通过几个日志(由STARTID和ENDID列标识的)计算得出的。

那么,什么可能是SQL查询,会给我所有对象的最新计算统计与相应的日志日期。
在给定的例子中,结果列将是:

 
OBJECTID | SETID | FREQUENCY | STARTDATE | ENDDATE 
====================================================== 
    1  | 1 | 0.45 | 2010-02-27 | 2010-03-01 
    2  | 1 | 0.6 | 2010-02-27 | 2010-03-01 
    3  | 1 | 0.02 | 2010-02-27 | 2010-03-01 
    4  | 2 | 0.6 | 2010-02-26 | 2010-02-28 
    5  | 2 | 0.6 | 2010-02-26 | 2010-02-28 

因此,最近对组1的统计信息被计算原木从02月27日至3月1日,而对于组2的统计信息被计算从2月26日至feb 28. 对象6不在结果行中,因为在最后一段时间内没有任何属性。

最后一件事,我使用MySQL。

任何想法?

+0

+1对于具有良好样本数据的明确公式化问题。 – 2010-03-08 11:39:55

+0

对于对象4,5,你的0.35是一个错字吗? (它应该是0.6?) – Patrick 2010-03-08 14:55:37

此查询是否适合您的问题?

SELECT objectid, l1.setid, frequency, l1.date as startdate, l2.date as enddate 
FROM `logs` l1 
INNER JOIN `stats` s ON (s.startid=l1.id) 
INNER JOIN `logs` l2 ON (l2.id=s.endid) 
INNER JOIN 
(
    SELECT setid, MAX(date) as date 
    FROM `logs` l 
    INNER JOIN `stats` s ON (s.startid=l.id) 
    GROUP BY setid 
) d ON (d.setid=l1.setid and d.date=l1.date) 
ORDER BY objectid 
+0

这不会为objectid 6返回一行,因为该对象没有setid = 1的日志 – Andomar 2010-03-08 14:25:39

+0

它不返回objectid 6请求的内容 – Patrick 2010-03-08 14:31:38

+0

问题比我想象的更模糊:)如何你会在示例结果中解释对象5的频率0.35吗? – Andomar 2010-03-08 14:49:48

如果没有关系,可以使用过滤连接。例如:

select stats.objectid 
,  stats.frequency 
,  startlog.setid 
,  startlog.date 
,  endlog.date 
from  stats 
join  logs startlog 
on  startlog.id = stats.startid 
join  logs endlog 
on  endlog.id = stats.endid 
join  (
     select objectid, max(endlog.date) as maxenddate 
     from  stats 
     join  logs endlog 
     on  endlog.id = stats.endid 
     group by objectid 
     ) filter 
on  stats.objectid = filter.objectid 
     and filter.maxenddate = endlog.date 
order by stats.objectid 

您的示例结果看起来有些偏离,例如,对于objectid 5,其中频率等于0.35时没有行。

+0

您正在返回objectid 6什么是不请求的;) '对象6不在结果行中,因为在最后一段时间内没有任何属性' – Patrick 2010-03-08 14:35:01