mysql 查询按多个坐标边界过滤
mysql query to filter by multiple coordinates boundaries
我有一个包含带坐标的城市列表的数据库,我在这个查询中使用 mybatis 来查找给定边界的城市。
SELECT * FROM cities
WHERE lat > #{latMin}
AND lat < #{latMax}
AND lng > #{lngMin}
AND lng < #{lngMax}
现在我有多个边界,我多次调用查询以使所有边界中包含所有城市,而且速度越来越慢。
为了在不改变我的体系结构的情况下加快速度,我可以有一个单一的查询来输入一个(可能很长的)边界列表吗?也许是存储过程?
这个项目的限制是 mybatis 作为持久层和 mysql 作为数据库。
编辑:
这是我目前的mybatis方法。
List<CityDTO> getCityNearPoint(@Param("latMin") Double latMin, @Param("latMax") Double latMax,
@Param("lngMin") Double lngMin, @Param("lngMax") Double lngMax);
我不知道如何传递包含边界的对象数组并将它们映射到多个 OR。类似于:
List<CityDTO> getCityNearBoundaries(BoundaryDTO[] boundaries);
只需使用 OR 组合多个边界。您可以使用 Dynamic SQL (s.foreach) 或 @SqlProvider 注释方法来实现它,这将生成适当的 SQL 字符串。我更愿意使用动态 SQL。
在 xml 中,它将如下所示:
<select id="selectCitiesByBoundaries" resultType="CityDTO">
SELECT * FROM cities WHERE
<foreach item="boundary" index="index" collection="#{boundaries}"
open=" (" separator=") OR (" close=") ">
lat > #{boundary.getLatMin()} AND
lat < #{boundary.getLatMax()} AND
lng > #{boundary.getLngMin()} AND
lng < #{boundary.getLngMax()}
</foreach>
</select>
我有一个包含带坐标的城市列表的数据库,我在这个查询中使用 mybatis 来查找给定边界的城市。
SELECT * FROM cities
WHERE lat > #{latMin}
AND lat < #{latMax}
AND lng > #{lngMin}
AND lng < #{lngMax}
现在我有多个边界,我多次调用查询以使所有边界中包含所有城市,而且速度越来越慢。
为了在不改变我的体系结构的情况下加快速度,我可以有一个单一的查询来输入一个(可能很长的)边界列表吗?也许是存储过程?
这个项目的限制是 mybatis 作为持久层和 mysql 作为数据库。
编辑: 这是我目前的mybatis方法。
List<CityDTO> getCityNearPoint(@Param("latMin") Double latMin, @Param("latMax") Double latMax,
@Param("lngMin") Double lngMin, @Param("lngMax") Double lngMax);
我不知道如何传递包含边界的对象数组并将它们映射到多个 OR。类似于:
List<CityDTO> getCityNearBoundaries(BoundaryDTO[] boundaries);
只需使用 OR 组合多个边界。您可以使用 Dynamic SQL (s.foreach) 或 @SqlProvider 注释方法来实现它,这将生成适当的 SQL 字符串。我更愿意使用动态 SQL。 在 xml 中,它将如下所示:
<select id="selectCitiesByBoundaries" resultType="CityDTO">
SELECT * FROM cities WHERE
<foreach item="boundary" index="index" collection="#{boundaries}"
open=" (" separator=") OR (" close=") ">
lat > #{boundary.getLatMin()} AND
lat < #{boundary.getLatMax()} AND
lng > #{boundary.getLngMin()} AND
lng < #{boundary.getLngMax()}
</foreach>
</select>