我有一个“用户”表和一个“成员资格”表。
说,今天 2012-05-09
**user table**
ID name regDt
1 user - A 2012-03-05
**user_membership table**
userID membershipID isCurrent startDate endDate dateTaken
1 10 1 2012-03-05 2012-07-03 2012-03-05
1 5 0 2012-07-04 2012-09-02 2012-04-28
**membership table**
ID title days
5 Silver 60
10 Gold 120
以上数据表示用户“user -A”已于2012-03-05采取会员计划“金(120天)”。他在2012-04-28再次采取了另一个会员计划“银牌”(在他的黄金计划到期之前)。 假设,今天 2012-05-09。
现在,我需要一种方法来列出其会员计划已过期的所有用户。根据具体情况,我会将其从现有会话中注销,并向他们发送带有链接的电子邮件,以便制定新计划。我可以使用cron作业扫描“user”表的所有数据,目前我正在这样做。
但是,如果有超过20,000个用户,则处理速度会变慢。那么,您能否建议我任何逻辑或计划,以便我可以限制每天扫描的用户数量?
非常感谢您调查此问题。
答案 0 :(得分:2)
此查询将扫描数据库中其成员资格在当前日期到期的所有用户。 此查询假定您使用的是mysql,并且您的日期列处于某种日期类型
SELECT UM.* /* dont use *, grab whatever you feel is needed */
FROM user_membership UM
WHERE UM.endDate = CURDATE() /* OR '2012-05-09' */
此查询将仅获取endDate等于CURDATE()的记录。这只是当前的日期。 (将其更改为2012-05-09以符合您的条件)
如果您指的是特定用户,则首先需要他/她的身份
SELECT UM.* /* again choose what you want from this table */
FROM user_membership UM
WHERE UM.endDate = '2012-05-09' AND UM.userID = /* THE USERS ID!!!! */
此查询仅在用户具有在该特定日期过期的成员资格时才会找到该用户。
答案 1 :(得分:1)
userID和isCurrent都应该是键,这将大大加快处理速度。
只要包裹未过期或未被取消(退款退款,无论如何),isCurrent应设置为1。然后可以使用以下查询:
Select sum(*) as isActive
FROM user_membership
where isCurrent = 1 and
startDate >= CURDATE() and
endDate <= CURDATE() and
userID='1';
检查isActive是否&gt; 0查看成员资格是否有效。