MySQL查询均有订单的同名同VAT重复注册用户账号明细
问题分析
原SQL存在两处逻辑缺陷,无法满足输出要求:
- 直接按
first_name、last_name、VAT三个重复判定字段分组聚合,只能返回用户组维度的汇总统计,无法拆分展示组内单个账号的明细数据 - 现有过滤逻辑仅能排除组内所有账号都无订单的情况,无法保证组内每一个账号都至少关联1条订单记录
实现方案
通过CTE分层计算可以准确满足需求,逻辑如下:
- 第一层:基于全量用户表统计每个账号的关联订单总数,无订单的账号订单数记为0
- 第二层:按三个重复判定字段分组,同时校验两个规则:组内账号总数≥2、组内账号的最低订单数≥1(即组内不存在0单账号),筛选出完全符合要求的重复用户组
- 第三层:关联取到符合要求的分组下所有账号的明细数据,按指定格式逐行输出
可直接运行的SQL代码
WITH user_order_count AS ( -- 统计全量每个用户的订单数,无订单用户订单数记为0 SELECT u.id, u.first_name, u.last_name, u.VAT, COUNT(DISTINCT o.id) AS orders FROM users u LEFT JOIN orders o ON u.id = o.user_id GROUP BY u.id, u.first_name, u.last_name, u.VAT ), qualified_duplicate_groups AS ( -- 筛选符合要求的重复组:账号数≥2,且组内所有账号至少有1单 SELECT first_name, last_name, VAT FROM user_order_count GROUP BY first_name, last_name, VAT HAVING COUNT(DISTINCT id) >= 2, MIN(orders) >= 1 ) -- 输出组内所有账号的明细数据 SELECT uoc.first_name AS `first name`, uoc.last_name AS `last name`, uoc.VAT AS vat, uoc.id, uoc.orders FROM user_order_count uoc INNER JOIN qualified_duplicate_groups qdg ON uoc.first_name = qdg.first_name AND uoc.last_name = qdg.last_name AND uoc.VAT = qdg.VAT ORDER BY uoc.VAT, uoc.id;
返回结果说明
查询返回结果完全匹配需求格式:
- 每个重复注册的账号单独占一行
- 逐行展示用户的名、姓、VAT号、账号ID、该账号对应的订单总数
- 自动排除存在0单账号的重复组、账号数不足2的非重复组
内容的提问来源于stack exchange,提问作者Fabio Manniti
相关产品推荐
相关产品推荐

