在rails应用中搜索最接近的号码

时间:2011-01-02 06:03:40

标签: ruby-on-rails search conditional-statements

给出两个对应于对象上两个属性的参数如何在数据库中找到最接近这两个数字的20条记录。

您拥有的参数是x和y。该对象也具有这些属性。例如。 x = 1,y = 9999.您需要找到最接近x和y的记录。

2 个答案:

答案 0 :(得分:4)

这取决于您如何定义两点之间的距离。如果您使用的是二维笛卡尔坐标系,则此SQL语句将起作用:

SELECT id, x, y FROM points ORDER BY SQRT(POWER((X-x),2)+POWER((Y-y),2)) ASC LIMIT 20;

其中X,Y是输入。

答案 1 :(得分:1)

听起来你正在使用地理定位数据。如果您的数据库后端是Postgres,请检查您是否拥有或可以安装PostGIS扩展。这为您提供了非常快速的工具,可以为您提供搜索,例如“搜索到此点最近的东西”,“搜索此圈内的所有内容”,“搜索此广场内的所有内容”等等。

http://postgis.refractions.net/

你会做这样的事情:

CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometrycolumn] gist_geometry_ops);

然后你可以做这样的事情 - 找到100米范围内的所有东西:

SELECT * FROM GEOTABLE WHERE
GEOM && GeometryFromText(’BOX3D(900 900,1100 1100)’,-1) AND
Distance(GeometryFromText(’POINT(1000 1000)’,-1),GEOM) < 100;

the manual的例子。