如何在MySQL中查找无任何邮箱记录的客户?
问题描述
数据表中line与account的组合唯一标识一个客户(name为员工信息,无关),需要找出所有没有任何邮箱记录的客户(即该line+account组合下所有行的email都为空),预期结果是4-1000和7-1000。
数据表
| line | account | name | |
|---|---|---|---|
| 1 | 1000 | Reyes VonRueden Sr. | |
| 1 | 1000 | Dr. Elena Bartell V | |
| 1 | 1000 | Lucio Wehner | sharon51@yahooo.com |
| 2 | 1000 | April Hansen | |
| 2 | 1000 | Amy Waelchi | hegmann.khalid@yahooo.com |
| 2 | 1000 | Tremaine Cassin | |
| 3 | 1000 | Susana White Jr. | |
| 3 | 1000 | Roxane Hoeger | jfay@hotmailses.com |
| 3 | 1000 | Prof. Eric Boehm | |
| 4 | 1000 | Miles Considine | |
| 4 | 1000 | Araceli Effertz | |
| 4 | 1000 | Prof. Adolph Pacocha | |
| 5 | 1000 | Prof. Rafaela Hills | sydney20@gradyesses.com |
| 5 | 1000 | Delta Becker | |
| 5 | 1000 | Aditya Ratke | julian28@yahooes.com |
| 6 | 1000 | Miss Elaina Aufderhar Sr. | royal.predovic@connellyses.com |
| 6 | 1000 | Miss Stephanie Russel IV | |
| 6 | 1000 | Dr. Ramiro Marks IV | wrice@yahooes.com |
| 7 | 1000 | Garfield Kozey | |
| 7 | 1000 | Gene Hilpert |
解决方案
以下三种MySQL实现方式均可直接得到目标结果:
方法1:分组+HAVING过滤(最直观)
按line和account分组,筛选出分组内无有效邮箱的客户组合:
SELECT line, account FROM your_table_name GROUP BY line, account HAVING COUNT(TRIM(email)) = 0;
- 说明:
TRIM(email)用于排除仅含空格的无效值,COUNT()会忽略NULL和空字符串,计数为0则表示该客户下无任何有效邮箱记录。
方法2:子查询排除有邮箱的客户
先获取所有存在有效邮箱的客户组合,再从全量客户中排除这些:
SELECT DISTINCT line, account FROM your_table_name WHERE (line, account) NOT IN ( SELECT DISTINCT line, account FROM your_table_name WHERE TRIM(email) != '' AND email IS NOT NULL );
- 说明:子查询定位有至少一个有效邮箱的客户,外层用
NOT IN过滤,剩余结果即为无邮箱记录的客户。
方法3:左连接+空值过滤
通过左连接匹配有邮箱的客户,筛选未匹配到的记录:
SELECT DISTINCT t1.line, t1.account FROM your_table_name t1 LEFT JOIN ( SELECT DISTINCT line, account FROM your_table_name WHERE TRIM(email) != '' AND email IS NOT NULL ) t2 ON t1.line = t2.line AND t1.account = t2.account WHERE t2.line IS NULL;
- 说明:左连接后,
t2.line IS NULL的记录即为原表中无对应有效邮箱的客户组合。
内容的提问来源于stack exchange,提问作者nzoli
相关产品推荐
相关产品推荐

