我一直在阅读 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/