Mysql 选择 1 个月前保存的记录,如果没有找到,则选择较旧的记录

标签 mysql sql date

我有一个类似于以下内容的小统计表:

+----+----------+-------+------------+-------------+
| id | stat_key | value | created_at | customer_id |
+----+----------+-------+------------+-------------+

每天,cron 都会执行一些计算并保存每个客户的统计数据。

现在我想检索 30 天前的统计数据,或者如果客户是新客户,则只要 30 天以内,就可以使用旧的统计数据。

因此,我尝试执行以下查询,但对于 30 天以上的客户,返回的始终是所有时间中较旧的统计数据:

SELECT * 
FROM stat_table 
WHERE customer_id = 1 AND stat_key = 'some_key' 
HAVING (DATE(created_at) = DATE(NOW() - INTERVAL 30 DAY) 
       OR DATE(created_at) = DATE(MIN(created_at)));

有办法做到这一点吗? “给我30天前的统计数据,如果没有找到,你可以找到较旧的”

谢谢!

最佳答案

您可以将 limitorder by 一起使用来检索不超过 30 天的最旧行:

SELECT  * 
FROM    stat_table 
WHERE   customer_id = 1 
        AND stat_key = 'some_key' 
        AND created_at > NOW() - INTERVAL 30 DAY
ORDER BY
        created_at
LIMIT   1

关于Mysql 选择 1 个月前保存的记录,如果没有找到,则选择较旧的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16688449/

相关文章:

sql - 选择最近 5 天的所有数据

MySQL - 获取发生事件的月份列表

java - 如何在 Java 中将日期 (yyyy-MM-dd) 转换为符合时间顺序的整数值

ios - Swift 中特定于语言的日期本地化

php - 如何检查用户之前回复的帖子是否收到新回复?

PHP Javascript?当用户关闭页面或浏览器时做一些事情

php - 如何将 SQL 查询与 PHP 脚本结合起来

php - 使用SQL进行分页查询

mysql - 带 Pivot 的存储过程不返回结果结构,而是返回零值

php - 查询匹配多个关键字并显示结果?