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

SQL查询:获取col2含56和59但不含11的col1值

解决思路与SQL实现

嘿,这个需求其实用分组聚合或者多条件子查询都能搞定,我给你两种常用方案:

方案一:GROUP BY + HAVING 聚合判断

这是最直观的方法,通过分组后检查每个col1组的col2值是否满足所有条件:

SELECT col1
FROM your_table_name
GROUP BY col1
HAVING 
  -- 确保组内存在col2=56
  SUM(CASE WHEN col2 = 56 THEN 1 ELSE 0 END) > 0
  -- 确保组内存在col2=59
  AND SUM(CASE WHEN col2 = 59 THEN 1 ELSE 0 END) > 0
  -- 确保组内完全没有col2=11
  AND SUM(CASE WHEN col2 = 11 THEN 1 ELSE 0 END) = 0;

逻辑解释:

  • GROUP BY col1把相同col1的行归为一组
  • 第一个SUM(...)>0:统计组内col2=56的行数,大于0说明存在该值
  • 第二个SUM(...)>0:同理,确保组内有col2=59
  • 第三个SUM(...) =0:统计col2=11的行数等于0,说明完全没有这个值

用你的示例数据跑这个查询,结果正好是C,符合预期。

方案二:多EXISTS子查询

如果你的表数据量很大,这种方法可能性能更优(因为可以利用col2的索引):

SELECT DISTINCT col1
FROM your_table_name t1
-- 存在同一col1下的col2=56
WHERE EXISTS (
  SELECT 1 FROM your_table_name t2 
  WHERE t2.col1 = t1.col1 AND t2.col2 = 56
)
-- 存在同一col1下的col2=59
AND EXISTS (
  SELECT 1 FROM your_table_name t3 
  WHERE t3.col1 = t1.col1 AND t3.col2 = 59
)
-- 不存在同一col1下的col2=11
AND NOT EXISTS (
  SELECT 1 FROM your_table_name t4 
  WHERE t4.col1 = t1.col1 AND t4.col2 = 11
);

逻辑解释:

  • 外层查询遍历每个col1,通过三个子查询分别验证三个条件
  • EXISTS会在找到匹配行后立即停止查找,比全表聚合更高效(如果有合适索引的话)
  • DISTINCT确保结果里每个col1只出现一次

这两种方法都能完美解决你的问题,你可以根据自己表的实际数据量和索引情况选择合适的方案~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:15:53