2010-03-08 2 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 

СТАТИСТИКА:

 
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 вычисляется с бревнами от 27 февраля до 1 марта, тогда как статистика для набора 2 вычисляется по 26 февраля, чтобы feb 28. объект 6 не находится в строках результатов, так как в течение последнего периода нет статистики.

Последнее, что я использую MySQL.

Любая идея?

+0

+1 для четко сформулированного вопроса с хорошими данными образца. –

+0

Является ли ваш 0.35 для объекта 4, 5 опечаткой? (это должно быть 0,6?) – Patrick

ответ

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

Это не вернет строку для объекта 6, потому что для этого объекта нет журнала с setid = 1 – Andomar

+0

Он не возвращает objectid 6, что запрашивается – Patrick

+0

Вопрос более двусмыслен, чем я думал :) Как не могли бы вы объяснить frequncy 0.35 для объекта 5 в результатах этого примера? – Andomar

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

Смежные вопросы