我有一个会员资格mySQL数据库。其中一个表是会员历史记录和每次会员续订时的记录。有一个唯一的自动增量字段,一个用于成员的登录名(每个成员的常量)和一个用于到期日。
我正在寻找一种方法来搜索所有成员,例如,他们在2014年11月到期,然后在2015年1月续订(他们的新到期日为2016年1月)。每个数据将在表中的两个单独的行中。
所以,我希望找到login_name,其中expiry = 11月14日,如果有另一个expiry = 1月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 :(得分: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;