2015-02-06 70 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; 
相關問題