我有一个表,其中包含用户的出生日期列,我想知道 future 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 时,它会获取 future 7 天生日的用户列表。如果我明天再次执行 SQL,它将在满足 7 天的条件后获取相同的用户。
我不希望每天再次列出相同的用户进行处理。
如何更好地更改此 SQL?
SQL fiddle :http://sqlfiddle.com/#!2/7a294/1
最佳答案
您可以创建一个表来存储您可以每月左右清理一次的警报用户标识:
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 只会被“提醒”一次。
其他选项是在该表上注册服务的日期并将其纳入查询中,而不是使用不同的表。
关于mysql - 在 MySQL 生日处理中避免每天使用相同的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20314637/