我有一个成员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`


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

最佳答案

首先,我倾向于将其写为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;

10-08 04:57