2016-09-22 113 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