mysql查询按多个坐标边界过滤
Posted
技术标签:
【中文标题】mysql查询按多个坐标边界过滤【英文标题】:mysql query to filter by multiple coordinates boundaries 【发布时间】:2016-04-07 10:35:27 【问题描述】:我有一个数据库,其中包含一个带有坐标的城市列表,我正在使用 mybatis 和这个查询来查找给定边界的城市。
SELECT * FROM cities
WHERE lat > #latMin
AND lat < #latMax
AND lng > #lngMin
AND lng < #lngMax
现在我有多个边界,我多次调用查询以使所有城市都包含在所有边界中,但事情变得越来越慢。
为了加快速度,而不改变我的架构,我可以有一个单一的查询来输入一个(可能很长的)边界列表吗?也许是一个存储过程?
本项目的约束是mybatis作为持久层,mysql作为db。
编辑: 这是我目前的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);
【问题讨论】:
【参考方案1】:只需使用 OR 组合多个边界。您可以使用动态 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>
【讨论】:
我不明白如何传递对象数组并将它们映射到多个 OR。我将编辑我的问题以澄清。以上是关于mysql查询按多个坐标边界过滤的主要内容,如果未能解决你的问题,请参考以下文章