如何编写SQL查询筛选近2个月无报价的供应商联系邮箱?
解决近2个月无报价供应商邮箱的SQL查询问题
我来帮你搞定这个SQL查询的问题!先理清楚你的需求:要找出近2个月没有任何报价记录的供应商联系邮箱。咱们先拆解原查询的问题,再给出正确的写法。
你的表结构
offers表
id | supplier_id | updated_at (日期字段) 1 | 3 | 18-05-2018 2 | 1 | 01-01-2018
suppliers表
id | name | contact_email 1 | sujith | sujith@sujith.com 2 | naveen | naveen@naveen.com 3 | sanju | sanj@sanj.com
需求说明
筛选出近2个月内没有任何报价记录的供应商的contact_email,预期输出:
sujith@sujith.com naveen@naveen.com
原查询的问题
你写的查询有几个关键问题:
- 连接方式错误:
INNER JOIN只会返回同时存在于offers和suppliers的记录,但你要找的是没有报价记录或报价记录超过2个月的供应商,内连接会直接排除从未报过价的供应商(比如naveen)。 - 条件逻辑错误:你的
WHERE条件是找报价时间早于2个月前的记录,这会返回有旧报价的供应商,而不是近2个月完全没有报价的供应商;另外字段列表里漏了逗号,语法本身也有问题。 - 查询字段冗余:你不需要返回
offers的字段,目标只是供应商的邮箱。
正确的SQL查询
这里提供两种常用的写法,都能精准满足需求:
写法一:LEFT JOIN + 空值判断
SELECT s.contact_email FROM suppliers s LEFT JOIN offers o ON s.id = o.supplier_id AND o.updated_at >= DATE_SUB(CURDATE(), INTERVAL 2 MONTH) WHERE o.id IS NULL;
解释:
- 用
LEFT JOIN保留所有供应商,仅关联近2个月内有报价的记录 WHERE o.id IS NULL会筛选出近2个月没有匹配到报价的供应商(包括从未报过价的)
写法二:NOT EXISTS子查询
SELECT s.contact_email FROM suppliers s WHERE NOT EXISTS ( SELECT 1 FROM offers o WHERE o.supplier_id = s.id AND o.updated_at >= DATE_SUB(CURDATE(), INTERVAL 2 MONTH) );
解释:
- 子查询检查当前供应商是否存在近2个月内的报价记录
NOT EXISTS返回所有没有符合条件报价的供应商
这两种写法都会返回你预期的结果:sujith@sujith.com和naveen@naveen.com(sanju的最近报价在2个月范围内,所以被排除)。
内容的提问来源于stack exchange,提问作者user9804375
相关产品推荐
相关产品推荐

