2016-09-22 115 views
1

我有兩個MySQL表成員和member_cards。會員卡的每個會員卡都可以有三種狀態。MySQL查詢找到最近的成員

  • 活動=起始日期< =今天< = END_DATE
  • 未來=今天<起始日期
  • 過期= END_DATE <今天

成員表

id--------membership_number--------start_date-------------end_date 
1--------**123**--------------------------------09-20-2014-----------09-20-2015 
2--------**123**--------------------------------09-20-2015-----------09-20-2016 
3--------**123**--------------------------------09-20-2016-----------09-20-2017 
4--------**123**--------------------------------09-20-2017-----------09-20-2018 
5--------**456**--------------------------------09-20-2013-----------09-20-2014 
6--------**456**--------------------------------09-20-2014-----------09-20-2015 

會員卡

id--------membership_id-------------start_date-------------end_date 
1--------**1**--------------------------------09-20-2014-----------05-15-2015 
2--------**1**--------------------------------09-20-2014-----------09-20-2015 
3--------**2**--------------------------------09-20-2015-----------05-13-2016 
4--------**2**--------------------------------09-20-2015-----------09-20-2016 
5--------**3**--------------------------------09-20-2016-----------09-21-2016 (past) 
6--------**3**--------------------------------09-20-2016-----------05-15-2017 
7--------**3**--------------------------------09-20-2016-----------09-20-2017 
8--------**4**--------------------------------09-20-2017-----------05-13-2017 
9--------**4**--------------------------------09-20-2017-----------09-20-2018 
10-------**5**--------------------------------09-20-2013-----------05-13-2014 
11-------**5**--------------------------------09-20-2013-----------09-20-2014 
12------**6**--------------------------------09-20-2014-----------05-13-2015 
13-----**6**--------------------------------09-20-2014-----------09-20-2015 

我想要檢索

  1. 所有活動+未來會員+(如果有一個特定的會員號碼,最後期滿的記錄沒有活動的或未來的成員)

其結果是:

id--------membership_number--------start_date-------------end_date 
3--------**123**--------------------------------09-20-2016-----------09-20-2017 
4--------**123**--------------------------------09-20-2017-----------09-20-2018 
6--------**456**--------------------------------09-20-2014-----------09-20-2015 
  • 有效卡+(如果成員資格已過期,都綁到會員卡)
  • 結果:

    id--------membership_id-------------start_date-------------end_date 
    6--------**3**--------------------------------09-20-2016-----------05-15-2017 
    7--------**3**--------------------------------09-20-2016-----------09-20-2017 
    8--------**4**--------------------------------09-20-2017-----------05-13-2017 
    9--------**4**--------------------------------09-20-2017-----------09-20-2018 
    12------**6**--------------------------------09-20-2014-----------05-13-2015 
    13-----**6**--------------------------------09-20-2014-----------09-20-2015 
    

    每個表包含約20萬條記錄。我正在嘗試使用單個MySQL查詢使用UNION執行第二個查詢(對於member_cards)。有沒有更好的方法?

    +0

    UNION結合了兩個表並對它們進行排序,我認爲UNION ALL的速度更快,因爲它不排序組合的表。 [來源](http://www.iheavy.com/2013/06/13/how-to-optimize-mysql-union-for-high-speed/) – Roy123

    +0

    一個查詢不返回兩個結果集,所以你的問題目前尚不清楚。 –

    +0

    啊,我的不好。我的意思是第二個結果(對於會員卡)。 –

    回答

    0

    如上所述你的問題有點不清楚,但我寫了一個查詢,返回你的第二個目標表的基礎上的第一個。內部查詢返回您的第一個目標。

    select 
    b.id#, 
    b.membership_id, 
    b.start_date, 
    b.end_date 
    from membership_cards b 
    full outer join (
         select * from 
         (select a.*, 
         max(end_date) over (partition by membership_number) max_end_date, 
         case when 
          end_date>=sysdate --replace with today or whatever 
          then 1 --active 
          else 0 --inactive 
          end index_active 
         from memberships a) 
         where (end_date<=max_end_date and end_date>=sysdate) or 
           end_date = max_end_date) c 
    on c.id# = membership_id 
    where (c.index_active = 1 and b.end_date >= sysdate) or 
         c.index_active = 0