如何仅在经度和纬度在给定距离内时才显示查询结果

时间:2016-08-25 20:41:26

标签: php sql pdo

如何将两个$ sql查询组合成一个$ sql查询。我想输入一些名称,地址,城市或州,只有在指定的经度和纬度范围内才能显示。我已经尝试了很多方法将这些$ sql组合成一个,但只是无法弄清楚逻辑。请帮助。

    $sql = "SELECT *, ( 3959 * acos( cos( radians(47.64585) ) * cos( radians( lat ) ) * cos( radians( longitude ) - radians(-117.159999) ) 
+ sin( radians(47.64585) ) * sin( radians( lat ) ) ) ) AS distance FROM table HAVING distance > 100";

上面的$ sql和下面的$ sql在单独运行时工作得很好。我只包括上面的$ sql代码,而不是所有的连接和随之而来的东西。如果需要,我可以提供整个连接并显示表格代码。我还将使用经度,纬度和距离变量作为我当前的位置。我只是对它们进行了硬编码,以使我的例子更具可读性。

    $name = "text entered from search form";

$db= new pdo("mysql:host=localhost;dbname=$dbname",$username,$password);
$sql="SELECT * FROM table WHERE     
  companyname LIKE '%" . $name . "%' 
  OR
  address LIKE '%" . $name . "%'
  OR
  city LIKE '%" . $name ."%'
  OR
  state LIKE '%" . $name ."%'";

$result = $db->query($sql);
$numrows=$result->fetch(PDO::FETCH_ASSOC);

if ($result != false) {
    while($row=$result->fetch(PDO::FETCH_ASSOC)){
    $client_id=$row['client_id'];
    $companyname =$row['companyname'];
    $address=$row['address'];
    $city=$row['city'];
    $state=$row['state'];

echo  $client_id, $companyname, $address, $city, $state;

}
}
$result = null;

1 个答案:

答案 0 :(得分:0)

只需将第二个查询中的where子句添加到第一个查询。

width: 125px

但是警告,此查询将无法利用where子句中字段的任何索引与典型的B树索引。这是因为在搜索值的LIKE定义的开头有一个通配符,典型的b-tree索引只支持前缀匹配用例。您可能需要考虑自然语言搜索此用例。

如果您要大量使用地理空间功能,您可能还需要考虑使用MySQL空间扩展。除其他外,这将允许为处理空间数据而优化的特殊字段和索引类型。