根据距离进行搜索和排序

时间:2014-04-01 10:41:51

标签: php mysql database

我正在研究PHP& MySql应用程序。以下是我的建议和尝试:

我有一张包含机构资料的表格,其中包含机构名称,邮政编码,region_id,类别和其他详细信息。用户可以基于region_id和类别搜索机构。我可以SELECT * FROM TABLE WHERE category = 1 and region_id = 1。然后,我需要根据与给定邮政编码的用户的距离按升序对结果集进行排序。我有一个算法将用户postal_code转换为latlong并找到每个机构的距离(我对表中的每个机构都有lat)。

问题是我的桌子很大。当我在上面的场景中搜索时,结果集包含大约1000行。然后我必须从用户postal_code中找到每一行的距离,然后对其进行排序。现在,它在我的本地很快,但我很确定当它上线时,它需要花费大量的时间来搜索,计算和排序。然后我想通过一次显示10个结果来解决这个问题,但很明显不会解决,因为在我能够呈现结果之前我仍然需要计算距离和排序。

您认为解决此问题的最佳方法是什么?我正在考虑以lat的升序进行搜索,但由于lat long不是线性的,因此不会有意义。邮政编码是加拿大人。我不知道我是否能以某种方式利用它。

让我知道你们的想法。感谢。

2 个答案:

答案 0 :(得分:0)

我认为你可以尝试以下两件事之一:

  • 使用MySQL spatial support,它需要更改数据库架构,但我认为这对您的案例来说是典型的,因此它的性能应该很好 - 据说。
  • 编写查询以计算SQL中的距离,而不是PHP中,您不希望单个查询计算每一个距离,对吗?它会有类似的东西(粗略版本):

    SELECT ..., sqrt(
        (POW(latitude2 - latitude1, 2)) + 
        (POW(longitude2 - longitude1, 2)) 
     ) AS distance, ...
    

答案 1 :(得分:0)

您可以在查询中计算距离 (这是一个pasudo dode:)

sprintf("SELECT placeName, MARKER.lat, MARKER.lng, (6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distanza FROM MARKERtable....
HAVING distanza < '%s'", $lat, $lng, $lat, $distance)

其中$ lat和$ lan是用户的当前位置(或他选择的地址)。你比使用默认的$ distance或用户选择的一个过滤查询结果。

我在谷歌地图API中使用它:https://developers.google.com/maps/articles/phpsqlsearch_v3