MySQL查询查找最近的成员

时间:2016-09-22 09:41:25

标签: mysql sql relational-database database-performance

我有两个MySQL表成员资格和member_cards。每个会员资格&会员卡可以有三种状态。

  • Active = start_date< = today< = 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. 所有有效+未来会员资格+(如果特定会员编号没有有效或未来的会员资格,则是最后过期的会员资格)
  2. 结果:

    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
    
    1. 有效卡+(如果会员资格已过期,所有卡都与该会员资格相关联)
    2. 结果:

      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
      

      每个表包含大约200,000条记录。我正在尝试使用UNION使用单个MySQL查询执行第二个查询(对于member_cards)。还有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

如前所述,您的问题有点不清楚,但我已经编写了一个查询,根据第一个返回您的2'nd目标表。内部查询返回你的第一个目标。

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