【问题标题】:where col in() clause for geometry column in mysqlmysql中几何列的col in()子句
【发布时间】:2013-10-20 10:01:06
【问题描述】:

我有一个几何(点)列数据类型的表, 我将数据存储为 mysql 中的 POINT 对象,如下所示:

id      asText(latlng)

1   POINT(35.80684 51.427820000000004)

2   POINT(35.726940000000006 51.30407)

3   POINT(35.726940000000006 51.30407)

4   POINT(35.726940000000006 51.30407)

5   POINT(35.72343 51.303200000000004)

6   POINT(35.72675 51.303760000000004)

现在,我想通过给出一个 POINT 列表来选择和查找一些记录,并希望在 sql 语法中使用 WHERE in() 子句。

但是这个查询不起作用:

SELECT id, asText(latlng) FROM `points` WHERE latlng in (POINT(35.80684 51.427820000000004))

谁能帮我解决我的问题?

谢谢

【问题讨论】:

    标签: mysql select geometry


    【解决方案1】:

    查询的正确形式使用 MySQL 中的 MBRWithin()MBRContains() 地理空间函数来实际比较点并使用空间索引(如果可用)。

    这些函数还可以比较不同的地理空间对象,例如,使用最小边界矩形和 R 树来确定一个点是否在线串或多边形内。

    SELECT id, asText(latlng)
      FROM points
     WHERE MBRWithin(latlng,POINT(35.80684, 51.427820000000004));
    

    现场演示:http://sqlfiddle.com/#!2/394d0a/1

    【讨论】:

    • 谢谢,但我有多个点,想在我的表中找到所有点,就像这个查询 SELECT id, asText(latlng) FROM points WHERE asText(latlng) in ('POINT(35.80684 51.427820000000004)','POINT(35.72343 51.303200000000004)') 你能建议我用 MBRWithin 查询多个点吗?
    【解决方案2】:

    试试这个:-

    SELECT id, asText(latlng) FROM `points` WHERE asText(latlng) in ('POINT(35.80684 51.427820000000004)')
    

    【讨论】:

    • 谢谢,但不返回任何记录,我已将 where 子句更改为此 WHERE asText(latlng) in ('POINT(35.80684 51.427820000000004)') 并且它可以工作,但此查询是否使用空间索引来查找记录?
    • 不,该查询不使用空间索引。该查询需要全表扫描。
    • @Michael-sqlbot 我对你的回答发表评论请看,谢谢
    猜你喜欢
    • 2017-11-26
    • 1970-01-01
    • 2017-06-15
    • 2012-10-23
    • 1970-01-01
    • 2021-05-11
    • 2014-09-17
    • 1970-01-01
    • 2011-10-11
    相关资源
    最近更新 更多