地理距离搜索MYSQL

3

我正在使用MySQL的空间扩展进行地理搜索。为此,我编写了一个存储过程(当我在MySQL的命令行上尝试时,它确实非常有效),如下所示:

mysql> CALL test2(GeomFromText('POINT(-0.93961472 43.52843475)'),0.6 );

DROP PROCEDURE `test2`//
CREATE DEFINER=`root`@`localhost` PROCEDURE `test2`(IN center2 point,IN dist int)
BEGIN
SET @center = center2;
SET @radius = dist;

SET @bbox = CONCAT('POLYGON((', 
 X(@center) - @radius, ' ', Y(@center) - @radius, ',', 
 X(@center) + @radius, ' ', Y(@center) - @radius, ',', 
 X(@center) + @radius, ' ', Y(@center) + @radius, ',', 
 X(@center) - @radius, ' ', Y(@center) + @radius, ',', 
 X(@center) - @radius, ' ', Y(@center) - @radius, '))' 
);

SELECT professionnels.*, AsText(coord) 
FROM professionnels 
WHERE Intersects( coord, GeomFromText(@bbox) ) 
AND SQRT(POW( ABS( X(coord) - X(@center)), 2) + POW( ABS(Y(coord) - Y(@center)), 2 )) < @radius limit 20;
end

但问题是我需要从PHP中调用它。当我这样做时,返回一个错误,说:

PROCEDURE test2无法在给定的上下文中返回结果集

所以...我该如何使用替代方法来返回一组数据?
谢谢
1个回答

0

你可以将最后一部分改为

/*delete all rows from temp_table*/
DELETE FROM temp_table WHERE temp_table.somefield is not null;

INSERT INTO temp_table
  SELECT professionnels.*, AsText(coord) 
  FROM professionnels 
  WHERE Intersects( coord, GeomFromText(@bbox) ) 
  AND SQRT(POW( ABS( X(coord) - X(@center)), 2) 
      + POW( ABS(Y(coord) - Y(@center)), 2 )) < @radius limit 20;

然后您可以从temp_table中进行选择,找到结果集。


如果有多个用户进行搜索怎么办?这个搜索实际上是一个函数,允许用户在城市周围搜索一些POI,因此会被很多用户调用...我不能使用那种方法...它行不通。 - Fazoulette
好的..我改用MYSQLI驱动程序而不是MYSQL,它可以正常工作。我能够检索存储过程返回的数据集。但这样做是个好主意吗?谢谢。 - Fazoulette
@Fazoulete,这是一个技巧,但如果你使用临时表,每个会话都会有自己的表,因此用户将看不到彼此的结果。如果你直接从存储过程获取结果集,那就更好了。 - Johan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接