如何查询指定日期内的邮件及附件?需保留无附件的邮件记录
解决方法:用左连接(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表
idINTfrom_fldVARCHARto_fldVARCHARsubj_fldMEDIUMTEXTdate_fldDATETIMEmailboxVARCHARmailtoVARCHARbody_fldLONGTEXTnumAttachINTattachNamesMEDIUMTEXTattachTextMEDIUMTEXTheadingsMEDIUMTEXT
attachments表
idINTtype_fldVARCHARfilename_fldVARCHARencode_fldINTattach_fldLONGBLOB
origemail表
idINTorig_fldLONGBLOB
tags表
idINTcat_fldVARCHARkey_fldVARCHARpriority_fldINTnotes_fldMEDIUMTEXT
内容的提问来源于stack exchange,提问作者Katherin Romanova
相关产品推荐
相关产品推荐

