You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL三表连接实现每日昨日预约客户数据提取遇阻求助

解决每日拉取昨日预约客户信息的SQL方案

嘿,刚接触SQL连接不用慌,咱们一步步来搞定你的每日任务需求!你的核心目标是每天从customers表中提取昨日生成预约记录的客户ID和邮箱,基于MySQL且不能修改表结构,那咱们先从合理的表结构假设入手(毕竟你省略了非重要字段),再给出具体的SQL实现。

假设的表结构(贴合你的业务场景)

首先得明确,预约记录肯定存在一个单独的表(比如appointments),和customers表通过客户ID关联,关键字段如下:

  • customers表:id(客户主键)、email(客户邮箱)
  • appointments表:customer_id(关联customers.id的外键)、created_at(预约创建时间,datetime类型,用来筛选昨日记录)

基础实现SQL

先给你最直观的版本,容易理解,适合刚接触连接操作的场景:

SELECT 
    c.id AS customer_id,
    c.email AS customer_email
FROM 
    customers c
INNER JOIN 
    appointments a ON c.id = a.customer_id
WHERE 
    DATE(a.created_at) = CURDATE() - INTERVAL 1 DAY;

代码解释

  • 用表别名c(customers)和a(appointments)简化SQL写法
  • INNER JOIN确保只返回有对应昨日预约记录的客户信息(如果某客户没有预约,不会被查询出来)
  • DATE(a.created_at)把带时间的created_at转成纯日期格式,和CURDATE() - INTERVAL 1 DAY(获取昨日的日期)做匹配,这样就能精准筛选昨日的预约

性能优化版本(适合数据量大的场景)

上面的写法虽然直观,但如果appointments表的created_at字段有索引,DATE(a.created_at)会导致索引失效,查询效率下降。可以改成范围查询,既保证精准性,又能利用索引:

SELECT 
    c.id AS customer_id,
    c.email AS customer_email
FROM 
    customers c
INNER JOIN 
    appointments a ON c.id = a.customer_id
WHERE 
    a.created_at >= CURDATE() - INTERVAL 1 DAY
    AND a.created_at < CURDATE();

优化逻辑

这个条件的意思是:预约创建时间大于等于昨日00:00:00,且小于今日00:00:00,完美覆盖昨日全天的所有记录,同时因为是直接对created_at做范围判断,可以正常使用字段上的索引,查询速度更快。

注意事项

  • 替换实际字段名:如果你的预约表不是appointments,或者创建时间字段不是created_at,记得改成你系统里的真实名称
  • 时区问题:如果你的业务涉及多时区,要确保MySQL的时区设置和业务时区一致,避免CURDATE()取的日期不符合预期
  • 每日任务执行:可以用MySQL自带的事件调度器来定时运行这个SQL,或者用外部工具(比如Linux的crontab、Windows的任务计划)来触发查询

内容的提问来源于stack exchange,提问作者pburgh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:19:38