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

如何查询指定日期内的邮件及附件?需保留无附件的邮件记录

解决方法:用左连接(LEFT JOIN)保留所有邮件记录

问题核心在于你使用的INNER JOIN——这种连接类型仅会返回两张表中满足关联条件(email.id = attachments.id)的交集记录,所以没有对应附件的邮件会被自动过滤掉。要实现“保留指定时间内所有邮件,无论是否有附件”的需求,你需要换成左连接(LEFT JOIN),它会完整保留左表(email)的所有符合条件的记录,右表(attachments)中没有匹配的字段会填充为NULL。

修改后的SQL语句

SELECT 
    CONCAT(email.from_fld, date_fld) AS name, 
    email.body_fld, 
    attachments.attach_fld 
FROM email 
LEFT JOIN attachments ON email.id = attachments.id 
WHERE email.date_fld >= '2012-01-01 00:00:00' 
  AND email.date_fld <= '2013-01-01 23:59:59' 
ORDER BY email.date_fld ASC;

关键改动说明

  • 将INNER JOIN替换为LEFT JOIN,确保email表中所有符合时间条件的记录都被保留
  • 给date_fld加上表前缀email.,避免字段歧义(虽然当前只有email表有这个字段,但养成好习惯能避免后续表结构变更时的问题)

额外优化建议(可选)

如果你需要直观区分有附件和无附件的邮件,可以在SELECT中添加一个判断字段:

SELECT 
    CONCAT(email.from_fld, date_fld) AS name, 
    email.body_fld, 
    attachments.attach_fld,
    CASE WHEN attachments.id IS NOT NULL THEN '是' ELSE '否' END AS has_attachment
FROM email 
LEFT JOIN attachments ON email.id = attachments.id 
WHERE email.date_fld >= '2012-01-01 00:00:00' 
  AND email.date_fld <= '2013-01-01 23:59:59' 
ORDER BY email.date_fld ASC;

数据库表结构

email表

  • id INT
  • from_fld VARCHAR
  • to_fld VARCHAR
  • subj_fld MEDIUMTEXT
  • date_fld DATETIME
  • mailbox VARCHAR
  • mailto VARCHAR
  • body_fld LONGTEXT
  • numAttach INT
  • attachNames MEDIUMTEXT
  • attachText MEDIUMTEXT
  • headings MEDIUMTEXT

attachments表

  • id INT
  • type_fld VARCHAR
  • filename_fld VARCHAR
  • encode_fld INT
  • attach_fld LONGBLOB

origemail表

  • id INT
  • orig_fld LONGBLOB

tags表

  • id INT
  • cat_fld VARCHAR
  • key_fld VARCHAR
  • priority_fld INT
  • notes_fld MEDIUMTEXT

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:48:45