2015-02-06 37 views
1

我有一个成员mySQL数据库。其中一张表是会员历史记录,每次会员更新时记录。有一个唯一的自动递增字段,一个用于成员的登录名(这是每个成员的常数),一个用于到期日期。在数据库表中查找具有不同条件的两个条目

我正在寻找一种方法来搜索所有会员,例如,2014年11月到期,然后在2015年1月续约(其新的届满日期为2016年1月)。每个数据将在表中的两个单独的行中。

因此,我期待找到login_name其中expiry = 11月14日,并且如果还有另一个expiry = Jan 16条目,则会找到相同的登录名,然后将结果显示为列表。

我一直在沿着这些线路的工作,但我现在还没有...

SELECT * FROM `membership_history` 
WHERE `login_name` IN (
    SELECT `login_name` 
    FROM `membership_history` 
    WHERE `membership_enddate` BETWEEN '2014-11-01' AND '2014-11-30' 
    OR `membership_enddate` BETWEEN '2016-01-01' AND '2016-01-31' 
    GROUP BY `login_name` HAVING count(`login_name`) > 1 
) 
ORDER BY `login_name` 

任何提示或帮助将不胜感激 - 感谢

回答

0

首先,我会倾向于把它写成join而不是in。然后,除非出于性能原因(它过滤数据但不需要获得相同结果),否则可以删除where子句:

SELECT mh.* 
FROM `membership_history` mh JOIN 
    (select login_name 
     from membership_history mh2 
     group by login_name 
     having sum(membership_enddate BETWEEN '2014-11-01' AND '2014-11-30') > 0 and 
      sum(membership_enddate BETWEEN '2016-01-01' AND '2016-01-31') > 0 
    ) ml 
    on mh.login_name = ml.login_name; 
相关问题