php - 如何将 PHP radius 函数与多个变量一起使用?

标签 php mysql latitude-longitude

我一直在阅读 radius 和 mysql,我对如何使用多个搜索变量准确地实现代码感到非常困惑,所以有人可以为我分解它。

我的数据库有下表:

idx | type | price | item_desc | s_lat | s_long | created date

这是我当前的代码。

$search_origin_radius = "200";
$search_dest_radius = "100";
$search_origin_lat = "37.2629742";
$search_origin_long = "-98.286158";
$search_dest_lat = "37.2629742";
$search_dest_long = "-98.286158";
$type = "consumers";
$price = "100";

$sql = "SELECT * FROM products WHERE `price` = '$price'";

if($type && !empty($type))
{
    $sql .= " AND `type` = '$type'";    
}

到目前为止我发现的所有东西都说可以使用:

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( latitude ) ) 
    * cos( radians( longitude ) - radians(-122) ) + sin( radians(37) ) * sin(radians(lat)) ) ) AS distance 
FROM myTable
HAVING distance < 50
ORDER BY distance 

但我对如何为 $search_origin_radius$search_dest_radius 实现它感到非常困惑。基本上,我要做的是在这两个城市周围的价格范围和半径内找到所有待售商品。

示例我想在 200 英里以内的俄克拉荷马城和 100 英里以内的密苏里州堪萨斯城找到价格为 100 美元的所有商品。

编辑** 按照建议将其添加为存储函数。

function Calc_Distance($latitudeFrom, $longitudeFrom, $latitudeTo,         $longitudeTo, $earthRadius = 3959)
{
  // convert from degrees to radians
  $latFrom = deg2rad($latitudeFrom);
  $lonFrom = deg2rad($longitudeFrom);
  $latTo = deg2rad($latitudeTo);
  $lonTo = deg2rad($longitudeTo);

  $latDelta = $latTo - $latFrom;
  $lonDelta = $lonTo - $lonFrom;

  $angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
    cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
  return $angle * $earthRadius;
}

使用新查询但仍然没有显示:

$sql = "
SELECT *
FROM products
WHERE Calc_Distance(s_lat, s_long, $search_origin_lat, $search_origin_long) < 200
  AND Calc_Distance(s_lat, s_long, $search_dest_lat,   $search_dest_long)   < 100
  AND price = $price
";

最佳答案

俄克拉荷马城和堪萨斯城相距将近 300 英里。

俄克拉荷马城 200 英里以内和堪萨斯城 100 英里以内都可以考虑的土地非常少,因此您的查询未返回任何结果我并不感到惊讶。

也许你想在这里使用OR逻辑..

SELECT id
  FROM products
 WHERE (*Oklahoma City distance calc miles* < 200
    OR *Kansas City distance calc miles* < 100)
   AND price = 100;

..或者您可以为每个城市UNION ALL SELECT:

SELECT id, 'Oklahoma City' as city  
  FROM products
 WHERE *Oklahoma City distance calc miles* < 200
   AND price = 100

 UNION ALL

SELECT id, 'Kansas City'
  FROM products
 WHERE *Kansas City distance calc miles* < 100
   AND price = 100;

我个人倾向于第二种,因为它很容易在代码中构建,并且可以清楚地告诉您产品在哪个城市找到。

虽然正如@PaulSpiegel 所指出的,如果搜索区域相交,这个(未修改的)可能会多次返回一些产品。

关于php - 如何将 PHP radius 函数与多个变量一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40315551/

相关文章:

mysql安装ubuntu服务器: Could not open 'abstractions/mysql'

php - 从 mysql DB 获取所需数据时遇到一些问题

c# - MySql.Data.MySqlClient 引用在 Visual Studio 2015 中不起作用

iphone - 如何计算经纬度两点之间的距离?

php - Linux tar 命令 : compressing a directory but exluding subdirectories

javascript - 如何检测表单编辑以便仅在数据库上更新?

javascript - 从另一点以一定方位行驶一定距离后如何获得纬度和经度?

javascript - 将纬度和经度指定为全局使用的变量

php - FOSRestBundle 在获取 URL 中添加 'S'

php - 如何在 JavaScript 中显示 MySQL 中 "onclick"的下一个结果?