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

MySQL使用NOT IN查询无订单客户返回重复结果问题求助

现有SQL问题点

  • 笛卡尔积导致重复:最终查询t1 join t2未指定关联条件,会生成两个表行数的乘积结果,如果t1有5条满足条件的客户,t2的每一条无订单客户都会重复5次,这是你看到重复5次的直接原因。
  • t2逻辑错误:无订单的客户不会出现在orders表中,你用orders o join customers c只能匹配到有订单的客户,不可能拿到无订单群体;同时group by后面跟not in判断条件,语法逻辑完全错误。
  • t1筛选条件不符合需求:你写的count(o.orderNumber) = 5是刚好5单,需求是不少于5单,应该改成>=5。

解决方案

场景1:统一返回所有目标客户,加标识区分类型(最常用)

用左连接关联客户和订单表,直接按客户分组统计订单数,一次过滤出两类目标客户,逻辑清晰不会出现重复:

select 
    c.customerNumber,
    c.customerName,
    case 
        when count(o.orderNumber) >=5 then '订单数≥5单'
        when count(o.orderNumber) =0 then '无任何订单'
    end as customer_type
from customers c
left join orders o on c.customerNumber = o.customerNumber
group by c.customerNumber, c.customerName
having count(o.orderNumber) >=5 or count(o.orderNumber)=0;

场景2:需要两类客户分左右两列展示(对齐你原来的输出格式)

给两个cte加行号,按行号关联避免笛卡尔积,同时修正无订单客户的筛选逻辑:

with t1 as (
 -- 筛选订单数≥5的客户
 select 
     o.customerNumber, 
     c.customerName,
     row_number() over(order by c.customerName) as rn
 from orders o 
 join customers c on o.customerNumber = c.customerNumber
 group by o.customerNumber, c.customerName 
 having count(o.orderNumber) >= 5
),
t2 as (
 -- 筛选无订单的客户
 select 
     c.customerNumber, 
     c.customerName,
     row_number() over(order by c.customerName) as rn
 from customers c
 where c.customerNumber not in (select distinct customerNumber from orders)
)
select 
    t1.customerNumber as FiveOrderNumber, 
    t1.customerName as FiveOrderName,
    t2.customerNumber as NoOrderNumber, 
    t2.customerName as NoOrderName
from t1 
full join t2 on t1.rn = t2.rn
order by coalesce(FiveOrderName, NoOrderName);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:54:03