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查询按多个坐标边界过滤的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 索引:查询生成器的最佳实践

Linux——MySQL高阶语句杂而精

Linux——MySQL高阶语句杂而精

每次登录表时,我如何进行 mysql 查询以查找用户,以及与他一起的所有其他用户,按日期和时间过滤

MySQL按多个项目查询顺序

请教大家!mysql查询结果,过滤重复数据?