SQL求助:统计同时关联vendor和product的唯一ID数量
统计同时包含vendor和product类型的唯一ID数量的SQL解决方案
原代码问题分析
你写的SQL用AND条件判断同一行的Filter_type同时等于vendor和product,这在逻辑上不可能成立——一行记录的Filter_type只能是一个值,所以该语句永远返回空结果。
正确解决方案
方案1:GROUP BY + HAVING(推荐,性能较好)
先筛选出类型为vendor或product的记录,按ID分组后,筛选出同时包含两种类型的ID,可按需获取ID列表或直接统计数量:
-- 获取符合条件的ID列表 SELECT ID FROM Filters WHERE Filter_type IN ('vendor', 'product') GROUP BY ID HAVING COUNT(DISTINCT Filter_type) = 2; -- 直接统计符合条件的ID数量 SELECT COUNT(*) AS matching_id_count FROM ( SELECT ID FROM Filters WHERE Filter_type IN ('vendor', 'product') GROUP BY ID HAVING COUNT(DISTINCT Filter_type) = 2 ) AS valid_ids;
说明:COUNT(DISTINCT Filter_type)确保同一个ID下确实存在两种不同的类型,避免同一ID重复出现同一种类型的干扰。
方案2:自连接
通过表自连接,匹配ID相同且类型分别为vendor和product的记录:
-- 获取符合条件的ID列表 SELECT DISTINCT f1.ID FROM Filters f1 JOIN Filters f2 ON f1.ID = f2.ID WHERE f1.Filter_type = 'vendor' AND f2.Filter_type = 'product'; -- 直接统计数量 SELECT COUNT(DISTINCT f1.ID) AS matching_id_count FROM Filters f1 JOIN Filters f2 ON f1.ID = f2.ID WHERE f1.Filter_type = 'vendor' AND f2.Filter_type = 'product';
说明:DISTINCT用于避免重复统计同一个ID。
方案3:EXISTS子查询
先找到所有vendor类型的ID,再检查这些ID是否存在对应的product类型记录:
-- 获取符合条件的ID列表 SELECT DISTINCT ID FROM Filters f1 WHERE Filter_type = 'vendor' AND EXISTS ( SELECT 1 FROM Filters f2 WHERE f2.ID = f1.ID AND f2.Filter_type = 'product' ); -- 直接统计数量 SELECT COUNT(DISTINCT ID) AS matching_id_count FROM Filters f1 WHERE Filter_type = 'vendor' AND EXISTS ( SELECT 1 FROM Filters f2 WHERE f2.ID = f1.ID AND f2.Filter_type = 'product' );
说明:EXISTS子查询只要找到匹配记录就会停止,在大数据量下性能表现较好。
内容的提问来源于stack exchange,提问作者Vishal Soni
相关产品推荐
相关产品推荐

