如何正确查询指定业主(John)及周边坐标范围内的所有房产?
解决John房产及周边范围查询的SQL问题
原代码的问题
你的SQL报错核心原因是:当John拥有多套房产时,每个子查询都会返回多个坐标值,而BETWEEN运算符只能接收单个的上下限值,无法匹配多个范围,因此会触发"子查询返回多行"的错误。
正确的查询写法
方法1:使用EXISTS子查询(推荐,性能更优)
这种方式直接判断当前房产是否是John的,或者是否在任意一套John房产的±0.002范围内:
SELECT * FROM houses_table h WHERE h.house_owner = 'john' OR EXISTS ( SELECT 1 FROM houses_table john_houses WHERE john_houses.house_owner = 'john' AND ABS(CAST(h.coor_x AS DECIMAL(10,6)) - CAST(john_houses.coor_x AS DECIMAL(10,6))) <= 0.002 AND ABS(CAST(h.coor_y AS DECIMAL(10,6)) - CAST(john_houses.coor_y AS DECIMAL(10,6))) <= 0.002 );
方法2:使用JOIN关联查询
通过关联John的房产表,筛选出所有落在周边范围的房产,再用DISTINCT去重:
SELECT DISTINCT h.* FROM houses_table h JOIN houses_table john_houses ON john_houses.house_owner = 'john' AND CAST(h.coor_x AS DECIMAL(10,6)) BETWEEN CAST(john_houses.coor_x AS DECIMAL(10,6)) - 0.002 AND CAST(john_houses.coor_x AS DECIMAL(10,6)) + 0.002 AND CAST(h.coor_y AS DECIMAL(10,6)) BETWEEN CAST(john_houses.coor_y AS DECIMAL(10,6)) - 0.002 AND CAST(john_houses.coor_y AS DECIMAL(10,6)) + 0.002 OR h.house_owner = 'john';
关于新增的x_min/x_max/y_min/y_max字段的作用
这些字段能否解决问题,取决于它们的定义:
- 如果是预计算的John所有房产的坐标极值范围(比如x_min是John所有coor_x的最小值减0.002,x_max是最大值加0.002),可以简化查询:
SELECT h.* FROM houses_table h JOIN ( SELECT MIN(CAST(coor_x AS DECIMAL(10,6))) - 0.002 AS x_min, MAX(CAST(coor_x AS DECIMAL(10,6))) + 0.002 AS x_max, MIN(CAST(coor_y AS DECIMAL(10,6))) - 0.002 AS y_min, MAX(CAST(coor_y AS DECIMAL(10,6))) + 0.002 AS y_max FROM houses_table WHERE house_owner = 'john' ) john_range ON CAST(h.coor_x AS DECIMAL(10,6)) BETWEEN john_range.x_min AND john_range.x_max AND CAST(h.coor_y AS DECIMAL(10,6)) BETWEEN john_range.y_min AND john_range.y_max OR h.house_owner = 'john'; - 如果这些字段是单套房产自身的坐标范围(比如每个房产的x_min=coor_x-0.002),那对你当前的需求没有帮助——因为你需要的是相对于John所有房产的周边范围,而非单套房产自身的范围。
内容的提问来源于stack exchange,提问作者dprochen
相关产品推荐
相关产品推荐

