2016-04-06 16 views
0

MEMBER_STATUS = 2のテーブルからすべてのエントリを選択したいとします。ただし、このステータスは時間とともに変化します。メンバーのステータスが変更されるたびに、古いエントリはADRESS_historyという別のテーブルに保存されます。アドレステーブルの最後の変更は、2016年4月1日後に行われた場合にはタイムスタンプに基づく条件

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 

することは、私は表ADDRESS_historyにおけるユーザーの最新のエントリのメンバーのステータスを使用したいと思います。 ADDRESSテーブルの最後の変更が2016-04-01より前に行われたとき、ADDRESSテーブルのエントリのメンバーステータスを使用したいと思います。これを反映するためにこのクエリをどのように変更できますか?

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

結果は、あなたがここから開始することができます

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 

答えて

0

でなければなりません。

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 
関連する問題