MySQL如何实现跨多行AND条件匹配筛选jobno
问题原因说明
你写的WHERE ((class = 1 AND type = 3) AND (class = 2 AND type = 3))无返回结果是必然的:单条数据行的class字段不可能同时等于1和2,这个条件本身存在逻辑矛盾,无法匹配到任何行。
更优实现方案
你目前用的子查询内连接方案可以满足需求,还有两种性能更优、写法更简洁的实现:
- 聚合分组方案(兼容性最好,几乎支持所有SQL版本)
SELECT jobno FROM jobProps WHERE (class = 1 AND type = 3) OR (class = 2 AND type = 3) GROUP BY jobno -- 要求同一个jobno同时命中两个不同的class条件 HAVING COUNT(DISTINCT class) = 2 ORDER BY jobno
如果你的表中同一个jobno + class + type不存在重复数据,可以去掉DISTINCT直接写COUNT(*) = 2,执行效率更高。如果后续需要增加同时满足的条件,只需要调整WHERE中的OR分支和HAVING后的计数数值即可。
- 交集方案(逻辑最直观,支持PostgreSQL、SQL Server、MySQL 8.0及以上版本)
SELECT jobno FROM jobProps WHERE class=1 AND type=3 INTERSECT SELECT jobno FROM jobProps WHERE class=2 AND type=3 ORDER BY jobno
这个写法和你用内连接的逻辑完全一致,但代码更简洁,数据库优化器通常也能生成更高效的执行计划。
内容的提问来源于stack exchange,提问作者Barry Ralphs
相关产品推荐
相关产品推荐

