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

标签 mysql sql

我有一个表,其中包含用户的出生日期列,我想知道 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 只会被“提醒”一次。

sqlfiddle demo

其他选项是在该表上注册服务的日期并将其纳入查询中,而不是使用不同的表。

关于mysql - 在 MySQL 生日处理中避免每天使用相同的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20314637/

相关文章:

php - 在带有复选框的下拉列表中选择多个项目

java - JPQL - JPA 实体集合成员中所有项目的列表

php - 奇怪的 MYSQL 错误

MySQL 查询执行时间较长

sql - 查询以在 SSRS 图表的事务表上设置固定月份

mysql - 当 SET NAMES 与表的字符集不匹配时会发生什么?

mysql - 如何获得部门明智的最高薪水以及拥有它的员工姓名?

mysql - 如果表尚不存在,则创建表时出现 SQL 语法错误

PDI 中的 MySQLNonTransientConnectionException

mysql - 为什么这个查询不运行?