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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:55:22