我有发出自动续约通知到会员,其会员是关于基础上,他们购买了我们俱乐部的网上商店会员的最后日期到期,脚本:如何选择记录匹配的特定日期,但仅限于最近的记录不存在?
SELECT members.id, first, last, class, email, name AS membershipType, lifetime, store_transactions.dateModified FROM store_transactions
LEFT JOIN members ON memberID = members.id
WHERE
(
DATE(store_transactions.dateModified) = SUBDATE(CURDATE(), INTERVAL 1 YEAR)
/*AND
NOT EXISTS(SELECT * FROM store_transactions WHERE DATE(store_transactions.dateModified) > SUBDATE(CURDATE(), INTERVAL 1 YEAR))*/
)
AND categoryID = 1 AND lifetime != 'Y'
GROUP BY members.id
ORDER BY last, first
我每天跑这个脚本通过一个CRON的工作,并且它运行良好(或者我认为)通过发送电子邮件给所有在一年前购买会员的会员。但是,我没有考虑到会员可以在我的脚本发出自动提醒之前更新其成员的事实)。
**更新: 在试图实施该解决方案的几个你推荐(THANK YOU!),这是我现在有我的查询:
SELECT members.id, first, last, class, email, name AS membershipType, lifetime, store_transactions.dateModified, categoryID FROM store_transactions
LEFT JOIN members ON memberID = members.id
GROUP BY members.id
HAVING categoryID = 1 AND lifetime != 'Y'
AND DATE(MAX(store_transactions.dateModified)) = '2012-03-24' /* specific date to simplify debugging */
ORDER BY last, first
我觉得这是非常接近正确的解决方案,但GROUP BY往往会打破我的逻辑(这是我的头),因为我的store_transactions表具有不同类别的交易,可以由同一个成员(即会员,活动门票,广告,捐赠等)。为了这个查询的目的,我只关心查看成员类别事务(“categoryID = 1”)。额外的“lifetime!='Y'”禁止此查询返回其成员资格永不过期的终生成员。
总之,我希望此查询返回一年前拥有“categoryID = 1”事务的成员的记录,除非他们有“categoryID = 1”的更近期事务。下面是我的store_transactions表中的字段的情况下,它可以帮助:
ID 发票 MEMBERID 的categoryID 的productID 名 价格 数量 dateModified addedBy
因此,如果有人做一个次要购买它将在同一个表中?然后你可以选择'MAX(store_transactions.dateModified)' – Horen 2013-03-07 22:17:14
谢谢Horen。我相信你的提示很好,但我在执行时遇到问题(见下文)。另外,我会更新我的代码以显示最新内容。 – psterling 2013-03-17 15:31:02