2010-03-08 5 views
6

j'ai les deux tableaux ci-dessous (avec quelques données d'échantillons)Fusionner les requêtes dans une requête

Logs:

 
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 

Chaque jour, de nouveaux journaux sont analysés sur différents ensembles d'objets et stockés dans la table LOGS. Parmi d'autres processus, certaines statistiques sont calculées sur les objets contenus dans ces ensembles et les résultats sont stockés dans la table STATS. Ces statistiques sont calculées à l'aide de plusieurs journaux (identifiés par les colonnes STARTID et ENDID). Donc, quelle pourrait être la requête SQL qui me donnerait les dernières statistiques calculées pour tous les objets avec les dates de journal correspondantes.
Dans l'exemple donné, les lignes de résultat serait:

 
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 

Ainsi, les plus récentes statistiques pour l'ensemble 1 sont calculées avec les journaux de février 27 à mars 1, tandis que les statistiques pour l'ensemble 2 sont calculées à partir de 26 février à feb 28. l'objet 6 ne se trouve pas dans les lignes de résultat car il n'y a pas de statistiques sur celui-ci dans la dernière période de temps.

Dernière chose, j'utilise MySQL.

Une idée?

+0

+1 pour une question clairement formulée avec de bonnes données d'échantillon. –

+0

Est-ce que votre 0,35 pour l'objet 4, 5 est une faute de frappe? (il devrait être 0,6?) – Patrick

Répondre

3

Est-ce que cette requête correspond à votre question?

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

Cela ne retournerait pas une ligne pour objectid 6, parce qu'il n'y a pas de journal avec setid = 1 pour cet objet – Andomar

+0

Il ne retourne pas objectid 6 ce qui est demandé – Patrick

+0

Question est plus ambigu que je pensais :) Comment Pourriez-vous expliquer la fréquence 0,35 pour l'objet 5 dans les résultats de l'exemple? – Andomar

1

S'il n'y a pas de lien, vous pouvez utiliser une jointure filtrante. Par exemple:

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 

Votre exemple les résultats semblent être légèrement, par exemple il n'y a pas de ligne pour objectid 5 où la fréquence est égale à 0,35.

+0

Vous renvoyez objectid 6 ce qui n'est pas demandé;) 'l'objet 6 ne se trouve pas dans les lignes de résultats car il n'y a pas de stat dessus dans le dernier laps de temps' – Patrick

Questions connexes