2016-04-06 14 views
0

Ich möchte alle Einträge aus einer Tabelle auswählen, wo MEMBER_STATUS = 2. Dieser Status kann jedoch im Laufe der Zeit ändern. Jedes Mal, wenn sich der Mitgliedsstatus ändert, wird der alte Eintrag in einer anderen Tabelle namens ADRESS_history gespeichert.Wo Bedingung basierend auf Timestamp

ADDRESS (each ID only exists once) 
ID | FIRSTNAME | LASTNAME | MEMBER_STATUS | DTM 
1 | Tom  | Mueller | 2    | 2016-04-02 
2 | John  | Doe  | 2    | 2016-03-02 
3 | David  | Allen | 4    | 2016-04-04 
4 | Neil  | Fiore | 8    | 2016-04-04 

ADDRESS_history (IDs can have multiple entries) 
ID | FIRSTNAME | LASTNAME | MEMBER_STATUS | DTM 
2 | John  | Doe  | 2    | 2012-02-02 
3 | David  | Allen | 2    | 2013-03-01 
1 | Tom  | Mueller | 1    | 2015-03-30 
2 | John  | Doe  | 2    | 2015-08-22 
1 | Tom  | Mueller | 4    | 2012-02-02 
1 | Tom  | Mueller | 3    | 2013-02-02 

Wenn die letzte Änderung in der Adresstabelle stattfindet, nach 2016.04.01, würde Ich mag den Mitgliedsstatus des letzten Eintrags für den Benutzer in der Tabelle ADDRESS_history verwenden. Wenn die letzte Änderung in der Tabelle ADDRESS vor 2016-04-01 stattgefunden hat, möchte ich den Mitgliedsstatus des Eintrags aus der Tabelle ADDRESS verwenden. Wie kann diese Abfrage geändert werden, um dies widerzuspiegeln?

select * 
from ADDRESS a 
join ADDRESS_history using (ID) 
MEMBER_STATUS = 2 

Das Ergebnis sollte von hier sein

ID | FIRSTNAME | LASTNAME | MEMBER_STATUS | DTM 
1 | Tom  | Mueller | 1    | 2015-03-30 
2 | John  | Doe  | 2    | 2016-03-02 
3 | David  | Allen | 2    | 2013-03-01 

Antwort

0

Sie beginnen können.

SELECT a.id 
    , a.firstname 
    , a.lastname 
    , if(a.dtm >= '2016-04-01' 
     , (SELECT ah.member_status 
       FROM address_history ah 
       WHERE ah.id = a.id 
       AND ah.dtm = t.dtm 
      ) 
     , a.member_status 
     ) member_status 
    , if(a.dtm >= '2016-04-01' 
     , t.dtm 
     , a.dtm 
     ) dtm 
    FROM address a 
    LEFT JOIN (SELECT id, max(dtm) dtm 
        FROM address_history 
        WHERE dtm < '2016-04-01' 
        GROUP BY id 
      ) t 
     ON t.id = a.id 
    WHERE a.member_status = 2 
    OR t.id is not null 
Verwandte Themen