如何在单表中实现多行条件筛选?获取同时使用产品1和2的客户
如何在单表中筛选出同时使用产品1和2的客户
针对你给出的productdetails表数据,要找出同时使用产品1和产品2(即对应两个产品的is_use字段均为1)的客户,这里有几种实用的SQL实现方法:
方法一:GROUP BY + HAVING 分组筛选
这是最常用的方案之一,通过分组后统计符合条件的产品数量来判断:
SELECT customer FROM productdetails WHERE product IN (1, 2) AND is_use = 1 GROUP BY customer HAVING COUNT(DISTINCT product) = 2;
逻辑说明:
- 先筛选出所有产品为1或2、且
is_use为1的有效记录; - 按
customer分组,统计每个客户下符合条件的不同产品数量; - 用
HAVING子句过滤出恰好拥有2种产品的客户(也就是同时满足产品1和2都被使用)。
方法二:自连接查询
通过将表与自身连接,分别匹配两个产品的使用条件:
SELECT DISTINCT a.customer FROM productdetails a JOIN productdetails b ON a.customer = b.customer WHERE a.product = 1 AND a.is_use = 1 AND b.product = 2 AND b.is_use = 1;
逻辑说明:
- 把表拆分为两个逻辑表
a和b,分别代表客户使用产品1和产品2的记录; - 通过
customer字段关联两个表,筛选出同时满足a表中产品1被使用、b表中产品2被使用的客户; - 用
DISTINCT避免重复结果(如果有多余记录的话)。
方法三:EXISTS 子查询
利用子查询验证客户是否同时满足两个产品的使用条件:
SELECT DISTINCT customer FROM productdetails a WHERE a.product = 1 AND a.is_use = 1 AND EXISTS ( SELECT 1 FROM productdetails b WHERE b.customer = a.customer AND b.product = 2 AND b.is_use = 1 );
逻辑说明:
- 先找出所有使用产品1的客户;
- 对每个客户,用
EXISTS子查询检查该客户是否存在使用产品2的记录; - 最终返回同时满足两个条件的客户列表。
验证结果
针对你提供的表数据,以上三种方法都会返回customer = 3,这是唯一同时使用产品1和2的客户。
内容的提问来源于stack exchange,提问作者Arunkumar Muthuvel
相关产品推荐
相关产品推荐

