我在这里使用了答案来设置我的查询:
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表之后不可能注意到”。我正在使用MySQL 5.1.39。
由于导出是在某种编码中,或者某些东西是一个点,这里是截图。忽略额外的列。
编辑:我最终切换到Postgresql。类似的查询更短,并且有效。
答案 0 :(得分:1)
我使用Postgresql而不是更容易。
我用于查找附近用户的查询是:
$ sql =" SELECT *,st_astext(location_geometry)作为latlon FROM用户,其中id!=?和年龄之间?和? $ gender_sql $ interested_in_sql和id not in(从from_id =?中选择to_id)ORDER BY location_geometry< - >" " st_setsrid(st_makepoint(?,?),4326)限制10&#34 ;;
这使用< - >运算符,在这种情况下排序经度lattidude列。您可以忽略$ gender_sql和$ interested_in_sql,因为它是特定于应用程序的。
st_makepoint中的两个参数是纬度和经度。
这使用PostGIS扩展。我使用Bitnami安装服务器软件,默认情况下启用了该扩展程序。