将查询合并到一个查询中

时间:2010-03-08 11:12:58

标签: sql mysql

我有以下两个表(带有一些示例数据)

日志:

 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

因此,使用从第27行到第3行的日志计算第1组的最新统计数据,而从第26行到第28行计算第2组的统计数据。 对象6不在结果行中,因为在最后一段时间内没有任何属性。

最后,我使用MySQL。

任何想法?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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。