1

我在这里使用答案来设置我的查询:

https://stackoverflow.com/a/1006668/211457

我正在运行这个查询:

SELECT  * 
FROM    users 
WHERE   MBRContains(LineFromText(CONCAT( 
    '('    , 39.76784253493 + 10 / ( 111.1 / cos(RADIANS(39.76784253493)))
    , ' '
    , -75.871009379625 + 10 / 111.1
    , ','
    , 39.76784253493 - 10 / ( 111.1 / cos(RADIANS(-75.871009379625)))
    , ' '
    , -75.871009379625 - 10 / 111.1 
    , ')' ))
    ,location)

我的数据库有这些条目

CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `location` point NOT NULL,
  PRIMARY KEY (`id`),
  SPATIAL KEY `sx_place_location` (`location`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `users` (`id`, `location`)
VALUES
    (1,X'000000000101000000E17A14AE47E1434088855AD3BCF752C0'),   
    (2,X'000000000101000000E9FF1F9EBEF752C0440008AA48E24340');

当我希望返回第二行时,没有返回任何结果,因为这是我在查询中使用的值。我检查的一件事是我是否切换了经度和纬度的值,但在这两种情况下都没有返回任何内容。当我对查询运行解释时,它说“在阅读 const 表后注意到不可能的 WHERE”。我正在使用 MySQL 5.1.39。

由于导出是某种编码或某种形式,因此这里是一个屏幕截图。忽略多余的列。

截屏

编辑:我最终切换到 Postgresql。类似的查询更短并且有效。

4

1 回答 1

1

我为此使用了 Postgresql,但它更容易。

我用于查找附近用户的查询是:

$sql="SELECT *, st_astext(location_geometry) as latlon FROM users where id != ? and age between ? and ? $gender_sql $interested_in_sql and id not in (select to_id from rating where from_id = ?) ORDER BY location_geometry <-> " ." st_setsrid(st_makepoint(?,?),4326) LIMIT 10";

这使用 <-> 运算符,在这种情况下对经度纬度列进行排序。您可以忽略 $gender_sql 和 $interested_in_sql 因为这是特定于应用程序的。

st_makepoint 中的两个参数是纬度和经度。

这使用 PostGIS 扩展。我使用 Bitnami 安装服务器软件,默认情况下启用了该扩展。

于 2014-03-29T01:18:41.043 回答