目标
因此,我的目标是有一个SQL查询返回第一个日期,其中不超过5个记录遵守where子句(userId)。
当前架构
|id|user_id|scheduled_at|
|1 |1 |2023-03-16 |
|2 |1 |2023-03-15 |
|3 |3 |2023-03-15 |
|4 |1 |2023-03-15 |
|5 |1 |2023-03-15 |
∮我有什么成就∮
count(*) as cnt,
scheduled_at
from estudojo.user_scheduled_questions as uq where uq.user_id='1' and scheduled_at >= '2023-03-14'
group by scheduled_at
having cnt < 5
order by cnt ASC limit 1
回报是:
┌─────────┬─────┬─────────────────────────────┐
│ (index) │ cnt │ scheduled_at │
├─────────┼─────┼─────────────────────────────┤
│ 0 │ 3 │ '2023-03-15' │
└─────────┴─────┴─────────────────────────────┘
但仍然不是我想要的,因为第一个可用的日期是2023-03-14
期待
我以为会是这样:
┌─────────┬─────┬─────────────────────────────┐
│ (index) │ cnt │ scheduled_at │
├─────────┼─────┼─────────────────────────────┤
│ 0 │ 0 │ '2023-03-14' │
└─────────┴─────┴─────────────────────────────┘
1条答案
按热度按时间qyyhg6bp1#
您的数据中现在有该用户在3月14日的行,因此查询无法返回您期望的结果。
如果你想让查询检查一个固定的日期范围,那么你需要先生成一个范围,然后用一个
left join
来调用这个表。在MySQL 8.0中,我们可以用递归查询来完成这个任务:递归CTE生成3月14日到今天之间的所有日期(您可能需要调整边界);然后,外部查询计算每个日期(以及给定用户)在源表中可以找到多少行,剩下的只是使用
having
(您在原始查询中已经有了)进行聚合和过滤。注意:如果表中的日期包含时间部分,我们需要将连接条件更改为不等式: