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

MySQL查询需求:获取使用Program A的客户的所有服务记录

解决MySQL查询需求:获取使用过Program A的客户的全部服务记录

嘿,这个需求很典型,咱们可以用两种常用的SQL写法来实现,我给你拆解一下逻辑和代码:

首先明确核心需求:我们需要先定位所有曾经使用过Program A的客户编号(Cnum),然后提取这些客户在service表中的所有服务记录——不管他们后续用的是什么计费项目。

方法一:使用子查询(IN子句)

这是最直观的写法,先通过子查询筛选出用过A的客户,再在外层查询中匹配这些客户的所有记录:

SELECT *
FROM service
WHERE Cnum IN (
    -- 先获取所有使用过Program A的客户编号,用DISTINCT去重优化效率
    SELECT DISTINCT Cnum
    FROM service
    WHERE Program = 'A'
);

这里加DISTINCT是因为同一个客户可能多次使用Program A,去重后能减少外层查询的匹配次数,让执行更高效;即使不加DISTINCT,结果也是正确的,但效率会稍差一点。

方法二:使用JOIN连接查询

如果数据量较大,JOIN的方式通常比IN子句效率更高,思路是先生成一个包含目标客户的临时表,再和原表关联:

SELECT s.*
FROM service s
-- 临时表存储所有使用过Program A的客户编号
JOIN (
    SELECT DISTINCT Cnum
    FROM service
    WHERE Program = 'A'
) a_customers ON s.Cnum = a_customers.Cnum;

这种写法的逻辑和子查询完全一致,但在处理大数据集时,数据库的查询优化器通常能更好地处理JOIN操作。

验证预期结果

根据你提供的测试数据,使用过Program A的客户是Cnum=1和Cnum=2,所以最终查询结果会包含以下4条记录:

snum cnum program sdate unit
1 1 A 2018-03-01 1
2 1 B 2018-03-02 1
3 2 A 2018-03-04 2
4 2 D 2018-03-05 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:33:21