合并查询到一个查询
问题描述:
我有以下两个表(带一些样本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。
任何想法?
答
此查询是否适合您的问题?
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
答
如果没有关系,可以使用过滤连接。例如:
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
+1对于具有良好样本数据的明确公式化问题。 – 2010-03-08 11:39:55
对于对象4,5,你的0.35是一个错字吗? (它应该是0.6?) – Patrick 2010-03-08 14:55:37