在MySQL生日处理中每天避免相同的用户

时间:2013-12-01 16:51:20

标签: mysql sql

我正在为用户提供一个有出生日期列的表格,我想知道在接下来的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吗?

SQL小提琴:http://sqlfiddle.com/#!2/7a294/1

1 个答案:

答案 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只会被“警告”一次。

sqlfiddle demo

其他选项是在该表上注册服务的日期并在查询中考虑该因素,而不是使用不同的表。