2010-03-08 103 views
6

我有以下兩個表(帶一些樣本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

回答

3

此查詢是否適合您的問題?

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

1

如果沒有關係,可以使用過濾連接。例如:

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