我正在为用户提供一个有出生日期列的表格,我想知道在接下来的7天内生日下降的用户。
我对此没有任何问题。我使用以下查询完成了这项工作。
SELECT userId,
DATE_ADD(dobValue, INTERVAL YEAR(CURDATE())-YEAR(dobValue) YEAR)
FROM users
WHERE dobValue is not null
AND DATE_ADD(dobValue, INTERVAL YEAR(CURDATE())-YEAR(dobValue) YEAR)
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)
我的问题是,当我今天运行SQL时,它会在接下来的7天内获取有生日的用户列表。如果我明天再次使用SQL,它将获取相同的用户,因为7天的条件得到满足。
我不希望每天再次列出相同的用户进行处理。
为此可以更好地更改此SQL吗?
答案 0 :(得分:2)
您可以创建一个表来存储警告的用户ID,您可以每月清理一次:
create table alerted(userId int, alertedDate timestamp);
然后你验证该表的查询:
SELECT userId,
DATE_ADD(dobValue, INTERVAL YEAR(CURDATE()) - YEAR(dobValue) YEAR) 'date'
FROM users
WHERE dobValue IS NOT NULL
AND DATE_ADD(dobValue, INTERVAL YEAR(CURDATE()) - YEAR(dobValue) YEAR)
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)
AND userId NOT IN (
SELECT userId
FROM alerted
);
但在同一份工作中,你做了:
INSERT INTO alerted
SELECT userId,
now()
FROM users
WHERE dobValue IS NOT NULL
AND DATE_ADD(dobValue, INTERVAL YEAR(CURDATE()) - YEAR(dobValue) YEAR)
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)
AND userId NOT IN (
SELECT userId
FROM alerted
);
这样,同一个userId只会被“警告”一次。
其他选项是在该表上注册服务的日期并在查询中考虑该因素,而不是使用不同的表。