无需多个SELECT语句查询匹配全部勾选交通类型的区域ID的方法
实现方案
使用GROUP BY + HAVING的固定语法即可,不需要随勾选的交通类型数量调整语句结构,仅需修改两处参数:
SELECT b_codigo FROM transporte -- 替换IN列表为实际勾选的所有交通类型 WHERE tipo_transporte IN ('Bus', 'Railway (FGC)') GROUP BY b_codigo -- 等号右侧的数字等于你勾选的交通类型总数量 HAVING COUNT(DISTINCT tipo_transporte) = 2;
用法示例
- 当仅勾选
Railway (FGC)时,修改WHERE条件为tipo_transporte IN ('Railway (FGC)'),同时将HAVING子句改为COUNT(DISTINCT tipo_transporte) = 1,即可返回7、8、11的正确结果。 - 当勾选3种及以上交通类型时,仅需要在IN列表中添加对应类型,同时把HAVING后的数字改为勾选总数即可,语句结构完全不变。
性能优化建议
- 给
transporte表创建(tipo_transporte, b_codigo)联合索引,该查询可以直接走索引覆盖,无需回表,性能远优于多条件拼接或INTERSECT拼接的写法。 - 如果表中不存在同一个
b_codigo对应重复tipo_transporte的记录,可以把COUNT(DISTINCT tipo_transporte)简化为COUNT(*),进一步提升查询效率。
内容的提问来源于stack exchange,提问作者Juan Andres Flores Gutierrez
相关产品推荐
相关产品推荐

