クラブのオンライン ストアでメンバーシップを最後に購入した日付に基づいて、メンバーシップの有効期限が近づいているメンバーに自動更新通知を送信するスクリプトがあります。
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 ジョブを介してこのスクリプトを毎日実行しましたが、ちょうど 1 年前にメンバーシップを購入したすべてのメンバーに電子メールを送信することで、うまくいきました (またはそう思った)。ただし、スクリプトが自動リマインダーを送信する前に、メンバーがメンバーシップを更新できるという事実を考慮していませんでした)。
**更新: あなたの何人かが推奨したソリューションを実装しようとしている間 (ありがとうございます!)、現在私がクエリとして持っているものは次のとおりです:
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 は私のロジックを壊す傾向があります (それは私の頭の中にあります)。メンバーシップ、イベント チケット、広告、寄付など)。このクエリでは、メンバーシップ カテゴリのトランザクション ("categoryID = 1") のみを調べます。追加の "lifetime != 'Y'" は、このクエリがメンバーシップの有効期限が切れない生涯メンバーを返すことを禁止します。
要約すると、このクエリでは、"categoryID = 1" のトランザクションが最近行われていない限り、ちょうど 1 年前に "categoryID = 1" のトランザクションを行ったメンバーのレコードが返されます。これが役立つ場合に備えて、store_transactions テーブルのフィールドを次に示します。
id 請求書 memberID カテゴリID productID 名前 価格 数量 dateModified addedBy