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
相关产品推荐
相关产品推荐

