MySQL查询如何排除type_of_bridge为Culvert的桥梁记录
问题描述
需要在MySQL桥梁数据查询结果中排除桥梁类型为Culvert(涵洞)的记录,当前使用的查询语句未添加对应过滤条件,返回结果包含不需要的Culvert类型数据。
当前使用的原始查询语句:
$qry = "select bm.bridge_id, state_code, zone, type_of_road, road_no, cumul_bridge_code, bm.longitude, bm.latitude, type_of_bridge, age_of_bridge, transaction_datetime, no_of_inventory_done, no_of_inspection_done, no_of_testing_done, no_of_repair_done, inventory_status, inspection_status, testing_status, repair_status from bridge_master bm, bridge_details id where bm.bridge_id = id.bridge_id group by 1 order by road_no, zone, bridge_id, transaction_datetime limit $start, $num_of_rows";
当前返回的冗余数据示例:
Bridge Details Record 1: Bridge ID : KAKA-01T024ZZ0130340123 State : Karnataka Zone : Bangalore Central (Koramangala) Age of Bridge : 41 years to 50 years Yrs Type of Bridge : Culvert Date : 2022-02-03 11:20:50 Record 2: Bridge ID : KAKA-01T024ZZ0130340123 State : Karnataka Zone : Bangalore Central (Koramangala) Age of Bridge : 41 years to 50 years Yrs Type of Bridge : Maximam Date : 2022-02-03 11:20:50
解决方案
直接在原有查询的WHERE条件中追加过滤规则即可,不需要改动其他查询、分组、排序、分页逻辑,修改后的完整代码如下:
$qry = "select bm.bridge_id, state_code, zone, type_of_road, road_no, cumul_bridge_code, bm.longitude, bm.latitude, type_of_bridge, age_of_bridge, transaction_datetime, no_of_inventory_done, no_of_inspection_done, no_of_testing_done, no_of_repair_done, inventory_status, inspection_status, testing_status, repair_status from bridge_master bm, bridge_details id where bm.bridge_id = id.bridge_id AND type_of_bridge != 'Culvert' group by 1 order by road_no, zone, bridge_id, transaction_datetime limit $start, $num_of_rows";
注意事项
- 核心改动只有一处:在原有WHERE的关联条件后拼接
AND type_of_bridge != 'Culvert',直接在数据库查询层面过滤掉不需要的记录,比等PHP拿到全量结果后再遍历剔除的效率高很多,也能减少不必要的内存占用。 - 注意单引号里的
Culvert大小写要和数据库中存储的字段值完全匹配,如果库里存的是小写culvert或者其他大小写形式,要改成对应的值,否则会出现过滤失效的问题。 - 你当前用的是隐式内连接写法,追加过滤条件直接用AND和原有WHERE条件拼接即可,不需要调整多表关联的逻辑,不会影响原有返回结果的结构。
内容的提问来源于stack exchange,提问作者makizhan
相关产品推荐
相关产品推荐

