如何将两个$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;
只需将第二个查询中的where子句添加到第一个查询中。
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
WHERE
companyname LIKE '%" . $name . "%'
OR address LIKE '%" . $name . "%'
OR city LIKE '%" . $name ."%'
OR state LIKE '%" . $name ."%'
HAVING distance > 100
需要注意的是,该查询将无法使用典型的b -树索引在where子句中的字段上利用任何索引。这是因为在搜索值的LIKE定义的开头有一个通配符,而典型的b-树索引只支持前缀匹配用例。对于这个用例,您可能需要考虑使用自然语言搜索。
如果你打算大量使用地理空间功能,你也可能需要考虑使用MySQL空间扩展。这将允许,除其他外,特殊字段和索引类型优化用于处理空间数据。