【问题标题】:Using a PHP function while Quering Database在查询数据库时使用 PHP 函数
【发布时间】:2013-07-31 13:04:03
【问题描述】:

我正在用 PHP 做一个项目。我有一张带有 LATLONG 字段的餐厅表。我想获得 10 家距离 USER 小于 5km 的餐厅(特定 cuisine_id)。 我正在使用以下函数来计算距离:

// Function for Getting distance between two coordinates.
function getDistance( $latitude1, $longitude1, $latitude2, $longitude2 ) {   
    $earth_radius = 6371;
    $dLat = deg2rad( $latitude2 - $latitude1 );  
    $dLon = deg2rad( $longitude2 - $longitude1 );  

    $a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * sin($dLon/2) * sin($dLon/2);  
    $c = 2 * asin(sqrt($a));  
    $d = $earth_radius * $c;  
    return $d;  
} 

从数据库中选择记录时是否可以使用该功能?

谁能告诉我一个示例查询,用于获取(使用 LIMIT 值)距离 5 公里 或更短的餐厅(用户 LATLONG 可用)一口气(如果可能的话,使用上面提到的getDistance 函数)。

【问题讨论】:

  • 您可以使用它来生成 mysql 运行的查询,或者运行 mysql 查询然后在结果上使用它。 mysql 无法在查询中运行 php 函数
  • “您要么使用它来生成查询 mysql 运行” - 我该怎么做?你能举个例子吗,因为我是 SQL 新手。
  • 考虑到您没有提供数据库的任何详细信息,因此很难给您答案
  • 如果您正在使用地理坐标,您可能需要查看spatial extensions

标签: php mysql sql


【解决方案1】:

看看这个question。我认为如果你用 mysql 编写你的函数,它会更容易与查询一起使用。我试图编写你的函数的一个版本..(语法可能不完美)

DELIMITER $$

CREATE FUNCTION distance(LAT1 DOUBLE(10,6), LON1 DOUBLE(10,6), LAT2 DOUBLE(10,6), LON2 DOUBLE(10,6))
RETURNS DOUBLE(10,2)
DETERMINISTIC
BEGIN
DECLARE r, dLat, dLon, a, c, d DOUBLE(10,6);
SET r=6371.0;
SET LAT1 = RADIANS(LAT1);
SET LON1 = RADIANS(LON1);
SET LAT2 = RADIANS(LAT2);
SET LON2 = RADIANS(LON2);
SET dLat = LAT2-LAT1;
SET dLon = LON2-LON1;
SET a = SIN(dLat/2.0) * SIN(dLat/2.0) + COS(LAT1) * COS(LAT2) * SIN(dLon/2.0) * SIN(dLon/2.0);
SET c = 2 * ASIN(SQRT(a));
SET d = c * r;
RETURN d;
END
$$

DELIMITER ;

那么,你可以做这样的事情......

$userLatitude = ...
$userLongitude = ...
$cuisine = ...

SELECT cuisine_id, distance(LAT,LONG,$userLatitude,$userLongitude) as Distance FROM Restaurants WHERE cuisine_id = $cuisine HAVING Distance < 5 ORDER BY Distance LIMIT 10;

【讨论】:

    【解决方案2】:

    sql server 查询和 php 函数执行是两个独立的东西,不能混用。 您要么必须在单独的步骤中完成该任务(因此首先计算,然后查询),或者您必须在 sql server 中实现您的函数,而不是在 php.ini 中。这是可能的,它被称为Stored procedure

    【讨论】:

      【解决方案3】:

      这个问题与mysql-great-circle-distance-haversine-formula有些相似

      SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance 
      FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;
      

      【讨论】:

        猜你喜欢
        • 2015-09-18
        • 1970-01-01
        • 2013-04-10
        • 2018-08-04
        • 2018-05-01
        • 2018-10-05
        • 2017-08-01
        • 1970-01-01
        • 2014-05-24
        相关资源
        最近更新 更多